思路:很明显这个填数是有顺序的,设定了起始点是右上角,那就应该先填右边一列,再填下面一行,再填左边一列,再填上边一行。每次填一行或者一列,都是一直填数,直到下标越界或者该位置的数已经填过了,这样就跳入下一个步骤,直到填入的数大于等于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;
}