蛇形填数。在n×n方阵里填入1,2,…,n×n,要求填成蛇形。例如,n=4时方阵为:
10 11 12 19 16 13 28 15 14 37 6 5 4
上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n≤8。
【分析】
从1开始依次填写。设“笔”的坐标为(x,y),则一开始x=0,y=n-1,即第0行,第n-1列(行列的范围是0~n-1,没有第n列)。“笔”的移动轨迹是:下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。总之,先是下,到不能填为止,然后是左,接着是上,最后是右。“不能填”是指再走就出界(例如4→5),或者再走就要走到以前填过的格子(例如12→13)。如果把所有格子初始化为0,就能很方便地加以判断。
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[10][10];
memset(a, 0, sizeof(a));
int num = 1;
int x = 0;
int y = n - 1;
a[x][y] = 1;
while (num < n * n)
{
while (a[x+1][y] == 0 && x+1<n) { a[++x][y] = ++num; }
while (a[x][y-1] == 0 && y - 1 >= 0) { a[x][--y] = ++num; }
//while (a[x - 1][y] == 0 && x - 1 >= 0) { a[--x][y] = ++num; }
while (a[x - 1][y] == 0 && x - 1 >= 0)a[--x][y] = ++num;
//while (a[x][y + 1] == 0&&y+1<n) { a[x][++y] = ++num; }
while (a[x][y + 1] == 0&&y + 1 < n )a[x][++y] = ++num;
}
for (int x = 0; x < n; x++)
{
for (int y = 0; y < n; y++)
{
cout << a[x][y] << " ";
}cout << endl;
}
}
while语句中,需要先判断再移动,而不是走一步发现越界了以后再退回来,所以需要预判;