題目
小明爲某機構設計了一個十字型的徽標(並非紅十字會啊),如下所示:
對方同時也需要在電腦dos窗口中以字符的形式輸出該標誌,並能任意控制層數。
#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;
}