老实说,最开始看到他我是拒绝的。转来转去晕了。后来看了网上的思路,给了我一些启示。于是我自己写了一个。
具体思路呢?
我是先按具体例子走的,比如说N=5的情况,就是由特殊推导一般。这里用count作计数器,它只需要加1就行了。用x,y作坐标,表示出每个点。先走第一排,就是x=0,y递增的情况。走到最后停止。但由于for的特性,y多加了1,所以下面就减掉。接下来要装最右侧一列,当然y不变。此时x还是0,所以x又加1。后面也是一样的思路。直到我把外圈全部填充,我发现接下来填充的方向又回到了水平。就是说,我的填充又要顺时针来一遍。我不禁有了些想法,我当然可以一直对应着写,但一旦N换了,那种穷尽的思想就不顶用了。这是不是暗示我该用循环了呢?
要使用循环,难点仍在于找到拐点。但此时,之前的x<=N-1 已经不再适用,还那么用,我会把已填充部分覆盖的。于是就想到,我先让整个数组全是0,一旦他被填充就不再是0。这样就有了限制第二条件,a[x][y] == 0,只有他是零,我才填充,不是零,那我就是到了边界,我要拐弯了。
感觉应该对,但又不可贸然进行全部改动。这让我想起了做小车的比赛,我该一点一点的写代码,边写边检验。只有这样,才不至于出现不知道哪错的情况。我一个个加条件。同时在纸上过一遍。
最后,很幸运,也很骄傲,我写对了。
下面附上源码:
#include<stdio.h>
int main()
{
int N,x=0,y=0,count=1;
int a[10][10] = {0};
scanf("%d",&N);
if(N==1)
{
a[0][0] = 1;
}
else
{
while(count<=N*N)
{
for( ;y<=N-1&&a[x][y] == 0;y++)
{
a[x][y] = count;
count++;
}
y--;
x++;
for( ;x<=N-1 && a[x][y] == 0 ;x++)
{
a[x][y] = count;
count++;
}
x--;
y--;
for( ;y>=0 && a[x][y] == 0;y--)
{
a[x][y] = count;
count++;
}
y++;
x--;
for( ;a[x][y]==0 ;x--)
{
a[x][y] = count;
count++;
}
x++;
y++;
}
}
for(x=0;x<=N-1;x++)
{
for(y=0;y<=N-1;y++)
{
printf("%3d",a[x][y]);
}
printf("\n");
}
return 0;
}