/顺时针蛇形填数
解题思路:
做这道题时我的思想就是跟走迷宫的思想差不多,让这个人沿顺时针方向走,每次走过一个点时留下一个数。
程序代码:
#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("= ",a[i][j]); printf("\n"); } return 0; }