蛇形填数。

蛇形填数。在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语句中,需要先判断再移动,而不是走一步发现越界了以后再退回来,所以需要预判;

猜你喜欢

转载自blog.csdn.net/weixin_45929885/article/details/113485086