/顺时针蛇形填数
解题思路:
做这道题时我的思想就是跟走迷宫的思想差不多,让这个人沿顺时针方向走,每次走过一个点时留下一个数。
程序代码:
#include<stdio.h>
int a[100][100],book[100][100];
int main()
{
int n,i,j,step=2,x=0,y=0,tx,ty;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//右,下,左,上。若想要输出逆时针蛇行填数,只需要改变几个坐标顺序就好了
scanf("%d",&n);
a[0][0]=1;//把第一个数保存下来
book[0][0]=1;//把第一个数标记,防止重复使用
for(i=0;i<4;)
{
tx=x+next[i][0];//从第二个点开始
ty=y+next[i][1];
if(ty>n-1||tx>n-1||book[tx][ty]==1||ty<0)/*先让这个人一直沿右走,直到它的众坐标,或者横坐标大于这个矩阵的边界值,或者小于边界值,再或者这个点已经走过了,此时要改变方向*/
{
i++;//改变方向
if(i==4)//需要判断是否已经走过一圈了,如果走到一圈后,i要赋值为零再从新按顺时针走一圈
{
if(step>n*n)//走完一圈判断步数是否大于n*n
break;
else
i=0;//从新按顺时针方向走
}
tx=x+next[i][0];//计算改变方向后的第一个数,并标记这个点已经走过
ty=y+next[i][1];
a[tx][ty]=step;
book[tx][ty]=1;
step++;
}
if(a[tx][ty]==0&&book[tx][ty]==0)//如果这个数是零,并且这个点没有走过,就留下对应的数
{
a[tx][ty]=step;
book[tx][ty]=1;
step++;
}
x=tx;y=ty;
if(step>n*n)
break;
}
//输出结果
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
return 0;
}