向↓走到不能填,再向←右,再向↑走,再向→走,可以看成一个周期,作为一个循环。
我是到了某一格,再判断当前格能不能走。判断依据是没有越界且这一格没有被填过,否则就换个方向。
外层循环终止条件是已经填了n*n个数。
#include <iostream>
#include <cstdio>
const int M=100;
int snake[M][M];
int main()
{
int n,i,j,cnt;
scanf("%d",&n);
i=cnt=0;
j=n-1;
while(cnt<n*n)
{
while(i<=n-1 && !snake[i][j])
snake[i++][j]=++cnt;
i--;
j--;
while(j>=0 && !snake[i][j])
snake[i][j--]=++cnt;
j++;
i--;
while(i>=0 && !snake[i][j])
snake[i--][j]=++cnt;
i++;
j++;
while(j<=n-1 && !snake[i][j])
snake[i][j++]=++cnt;
j--;
i++;
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%3d",snake[i][j]);
printf("\n");
}
}