2045蛇形填数(C语言)

一:题目

2045蛇形填数(C语言)_第1张图片

二:思路分析

1.大体的思路就是找到蛇形矩阵的循环规律,然后填数

常见的遍历方式:按行遍历,按列遍历,然后就是蛇形遍历

2.蛇形矩阵分析

2045蛇形填数(C语言)_第2张图片

3.由此可见这四条线路每一个都是一个小循环,这四条线路又构成一个大循环,大循环的条件就是n*n

4.对应线路一来说,当x =n时,x++就越界了,所以线路一的条件是x

2045蛇形填数(C语言)_第3张图片

5.此时还有一个问题,外层大循环是否可以取到等号呢?看似(以为例题目)要放16个数,肯定要取到等号啊,但是如果真的取到等号就会是死循环,这是为什么呢?因为16是最后一个数,它的四周一定是都放好数字了,肯定均不为0,但是我们这四个线路进入的条件都有一个下一个数为零的条件,所以如果取到等号,16这个数无法进入任何一个小循环,cont无法+1,cont会一直是16

三:代码

#include 
//2045蛇形填数
int main()
{
	int arr[22][22] = { 0 };
	int n = 0;
	scanf("%d", &n);
	int x = 1, y = n;
	int cont = 1;
	while (cont < n * n)
	{
		//线路一
		/*while (x < n && arr[x + 1][y] == 0)
		{
			arr[x][y] = cont;
			x++;
			cont++;
		}*/
		//cont和x都是先使用,再都加一,所以可以简写为
		while (x < n && arr[x + 1][y] == 0)
			arr[x++][y] = cont++;
		//线路二
		while (y >1 && arr[x][y-1] == 0)
			arr[x][y--] = cont++;
		//线路三
		while (x >1 && arr[x - 1][y] == 0)
			arr[x--][y] = cont++;
		//线路四
		while (y < n && arr[x][y+1] == 0)
			arr[x][y++] = cont++;
	}
	int i = 0,j = 0;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			if (arr[i][j] == 0)
				arr[i][j] = n * n;
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(题目讲解,算法,数据结构,c语言,开发语言,学习)