历届试题 打印十字图(模拟)
生活随笔
收集整理的這篇文章主要介紹了
历届试题 打印十字图(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
試題 歷屆試題 打印十字圖
資源限制 時間限制:1.0s 內存限制:256.0MB$Daily English:
我想要提醒這個星球上的人類唯一的一件事就是:我們
依賴地球母親生存。
The only thing I want is to awaken all humans on the planet that we are living on Mother Earth.
問題描述
小明為某機構設計了一個十字型的徽標(并非紅十字會啊),如下所示:
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..對方同時也需要在電腦dos窗口中以字符的形式輸出該標志,并能任意控制層數。
輸入格式
一個正整數 n (n<30) 表示要求打印圖形的層數。
輸出格式
對應包圍層數的該標志。
樣例輸入1
1樣例輸出1
..$$$$$.. ..$...$.. $$$.$.$$$ $...$...$ $.$$$$$.$ $...$...$ $$$.$.$$$ ..$...$.. ..$$$$$..樣例輸入2
3樣例輸出2
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..提示
請仔細觀察樣例,尤其要注意句點的數量和輸出位置。
思路:
這題有點意思(我看了好久,一開始想的太復雜導致一直不知到怎么動手!!浪費好多時間!!!好在沒有放棄!!!)。最后還是被我A了!!!哈哈~(悄悄開心一會)
簡單粗暴模擬(其實還是需要點腦子~):
中間十字先初始化好,然后抓住兩個起點,將每一圈劃分成四個部分,
每個部分,繪制每個部分需要記錄方向和步數。
具體看代碼~
代碼:
#include <iostream> #include <vector> using namespace std; char mp[150][150]; //dir: up,down,left,right:0,1,2,3 int step_x[] = {-1,1,0,0}; int step_y[] = {0,0,-1,1}; struct Point {int x;int y;Point(int xx,int yy){x = xx;y = yy;} }; vector<Point>vec;//設置每一部分的方向+步數 void initVec(int *dc_d,int *dc_c) {if(vec.size())vec.clear();for(int i = 0; i < 4; i++){vec.push_back(Point(dc_d[i],dc_c[i]));} } //繪制每一個部分 void work(int sx,int sy) {for(int i = 0; i < 4; i++){int dir = vec[i].x;int cnt = vec[i].y;int xx = sx + step_x[dir];int yy = sy + step_y[dir];mp[xx][yy] = '$';for(int j = 1; j < cnt; j++){xx += step_x[dir];yy += step_y[dir];mp[xx][yy] = '$';}sx = xx;sy = yy;} } int main() {int n;cin>>n;//圖像大小int m = 5 + 4 * n;//圖像初始化for(int i = 0; i < m; i++){for(int j = 0; j < m; j++){mp[i][j] = '.';}}Point center(2*n+2,2*n+2);//中間十字mp[center.x][center.y] = '$';for(int i = 0; i < 4; i++){int x1 = center.x + step_x[i];int y1 = center.y + step_y[i];mp[x1][y1] = '$';x1 += step_x[i];y1 += step_y[i];mp[x1][y1] = '$';}int y0 = center.y - 2,z0 = center.y + 2;//方向int dc_d0[] = {0,3,0,3};int dc_d1[] = {0,2,0,2};int dc_d2[] = {1,3,1,3};int dc_d3[] = {1,2,1,2};int x = 2 * n + 2;int y = y0,z = z0;//每圈分成4個部分for(int i = 1; i <= n; i++){//步數int dc_c[] = {2*i,2,2,2*i};//兩個起點的列y -= 2;z += 2;mp[x][y] = '$';mp[x][z] = '$';//左上initVec(dc_d0,dc_c);work(x,y);//右上initVec(dc_d1,dc_c);work(x,z);//左下initVec(dc_d2,dc_c);work(x,y);//右下initVec(dc_d3,dc_c);work(x,z);}for(int i = 0; i < m; i++){for(int j = 0; j < m; j++){cout<<mp[i][j];}cout<<endl;}return 0; }總結
以上是生活随笔為你收集整理的历届试题 打印十字图(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历届试题 大臣的旅费(树的直径)
- 下一篇: 试题 历届试题 买不到的数目(dp/数学