藍橋杯 歷屆試題 打印十字圖

題目

問題描述

小明爲某機構設計了一個十字型的徽標(並非紅十字會啊),如下所示:


對方同時也需要在電腦dos窗口中以字符的形式輸出該標誌,並能任意控制層數。

輸入格式
一個正整數 n (n<30) 表示要求打印圖形的層數。
輸出格式
對應包圍層數的該標誌。
樣例輸入1
1
樣例輸出1

樣例輸入2
3
樣例輸出2

提示
請仔細觀察樣例,尤其要注意句點的數量和輸出位置。


正文:

白的說,雖然看着那一圈圈的很有規律,但最開始我也不知道怎麼下手,(下圖爲添加空格之後的圖案)
在看了另一位博主的文章之後,看得出他是用的分塊兒輸出,不過我不喜歡這種方式,我更喜歡一步到位把它搞定。所以,再經過一番思考之後,我有了如下這個方法。
思路:就像題目裏說的(要求打印十字圖形的層數),而上邊的圖裏面也能看出這是非常有規律的一圈一圈的,0層($)和2層($)之間的1層(.)全是與之不同的符號(每兩層之間都被另一種符號填滿)。觀察到這個特點之後,想到遍歷0層的符號($)將每一個'$'周圍的符號(8個)凡不是'$'的全部變成' . ',將這些變成' . '的座標記錄下來,待0層遍歷完後,再遍歷記錄下來的這一層,依次類推。

代碼:(最好按照函數執行順序查看)
#include <stdio.h>
char ch[250][250] = { '\0' };	
int sit[1000][2],move[8][2] = { {0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1},{-1,0},{1,0} },M;
			//move數組用來進行對符號周圍的座標(上、下、左、右、左上、左下、右上、右下)的遍歷
 void g(int n)
    {
	if (n == 0 || n == 500)return;
	int t1,t2,j,i;
	char tc;
	if (n < 500) { t1 = 0; t2 = 500;  }		//sit數組只有一個,接連的兩次遍歷結果不能都往sit的開始放
	else { t1 = 500; t2 = 0;  }			//所以分爲0開始和500開始的兩部分
	for (i = t1; i < n; i++) {			//還有一些好處請自行體會
		if (ch[sit[i][0]][sit[i][1]] == '$')tc = '.';		//臨時的tc,當中間是 $ 時,tc 就是 . 
		else tc = '$';
		for (j = 0; j < 8; j++) {		//向八個方向遍歷
			int x = sit[i][0] + move[j][0], y = sit[i][1] + move[j][1];	//x和y也是臨時的,方便下面對座標的使用
			if (x >= 0 && x <= M&&y >= 0 && y <= M&&ch[x][y] == '\0') {   //確定在邊界內並且還沒動過
				ch[x][y] = tc;
				sit[t2][0] = x;
				sit[t2++][1] = y;		//保存座標
			}
		}
	}
	g(t2);
	return;
    }
 void f(int n)
    { 
	if (n == 0) { printf("$"); return; }		//0層打印'$'即可
	int N = 2 * n + 2, nn = 0;
	M = 4 * n + 4;				//層數n和圖形邊界M的關係
	ch[N][N] = ch[N + 1][N] = ch[N + 2][N] = ch[N - 1][N] = ch[N - 2][N] = ch[N][N + 1] = ch[N][N + 2] 	
		 ch[N][N - 1] = ch[N][N - 2] = '$';	//初始化中間的十字
    sit[nn][0] = N; sit[nn++][1] = N;
    sit[nn][0] = N+1; sit[nn++][1] = N;
	sit[nn][0] = N+2; sit[nn++][1] = N;
	sit[nn][0] = N-1; sit[nn++][1] = N;
	sit[nn][0] = N-2; sit[nn++][1] = N;
	sit[nn][0] = N; sit[nn++][1] = N+1;
	sit[nn][0] = N; sit[nn++][1] = N+2;
	sit[nn][0] = N; sit[nn++][1] = N-1;
	sit[nn][0] = N; sit[nn++][1] = N-2;		//將座標保存到sit數組
	g(nn);			//遍歷中間十字
    }
    int main()
    {
	int n;
	scanf("%d", &n);
	f(n);
	ch[M][0] = ch[0][M] = ch[0][0] = ch[M][M] = '.';	//注意四個角一定爲' . '
	for (int i = 0; i <= M; i++) {
		for (n = 0; n <= M; printf("%c", ch[i][n++]));
		printf("\n");
	}
	return 0;
     }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章