从某个角开始,按照顺时针或者逆时针填数。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
第一种方法
如果x,y没超出边界和下一个位置未访问,那就可以一直填数,否则就换个方向。
int main(int argc, const char * argv[]) {
int n;
scanf("%d", &n);
int x = 1, y = 1, tot = 1;
a[x][y] = 1;
while (tot < n*n) {
while (y+1 <= n && a[x][y+1] == 0) a[x][++y] = ++tot;
while (x+1 <= n && a[x+1][y] == 0) a[++x][y] = ++tot;
while (y-1 >= 1 && a[x][y-1] == 0) a[x][--y] = ++tot;
while (x-1 >= 1 && a[x-1][y] == 0) a[--x][y] = ++tot;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
printf("%5d", a[i][j]);
puts("");
}
return 0;
}
第二种方法
从 a[x][y]
开始填数,只要下一个位置的值为 0 就可以填数;
不为 0,可能已经填数或者到边界,那就需要换方向,如果 k==4,那方向就要重置;
const int MAXN = 22;
int a[MAXN][MAXN];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int main(int argc, const char * argv[]) {
int n;
scanf("%d", &n);
memset(a, -1, sizeof a);
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
a[i][j] = 0;
int x,y,tot, k = 0;
x = y = tot = 1;
while (tot <= n*n) {
a[x][y] = tot++;
if (a[x + dx[k]][y + dy[k]] != 0) {
k++;
k %= 4;
}
x = x + dx[k];
y = y + dy[k];
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
printf("%5d", a[i][j]);
puts("");
}
return 0;
}