思路:很明显这个填数是有顺序的,设定了起始点是右上角,那就应该先填右边一列,再填下面一行,再填左边一列,再填上边一行。每次填一行或者一列,都是一直填数,直到下标越界或者该位置的数已经填过了,这样就跳入下一个步骤,直到填入的数大于等于n*n,这样就说明n*n的方阵已经被填满了。
#include<stdio.h> #include<string.h> int a[100][100]; int main() { int n; int x,y; int val; while(scanf("%d",&n) != EOF) { memset(a,0,sizeof(a)); x = -1; y = n - 1; val = 0; while(val < n * n) { //右 while( x + 1 < n && !a[x + 1][y]) a[++x][y] = ++val; //下 while(y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++val; //左 while(x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++val; //上 while(y + 1 < n && !a[x][y + 1]) a[x][++y] = ++val; } for(x = 0; x < n; ++x) { for(y = 0; y < n - 1; ++y) { printf("%3d ",a[x][y]); } printf("%3d\n",a[x][n - 1]); } } return 0; }