2045蛇形填数(C语言)
2023-12-16 22:34:51
一:题目
二:思路分析
1.大体的思路就是找到蛇形矩阵的循环规律,然后填数
常见的遍历方式:按行遍历,按列遍历,然后就是蛇形遍历
2.蛇形矩阵分析
3.由此可见这四条线路每一个都是一个小循环,这四条线路又构成一个大循环,大循环的条件就是n*n
4.对应线路一来说,当x =n时,x++就越界了,所以线路一的条件是x<n,而这时针对于第一次循环的条件,当第二次走线路一的时候,有的位置已经有值了,就不可以在经过在这个地方了,所以再次走这条线路的时候还要判断它的下一个位置是否为零,如果不是零,则表示下一个位置已经有值了,那如果在该位置填值,那x++又会访问已经的值
5.此时还有一个问题,外层大循环是否可以取到等号呢?看似(以为例题目)要放16个数,肯定要取到等号啊,但是如果真的取到等号就会是死循环,这是为什么呢?因为16是最后一个数,它的四周一定是都放好数字了,肯定均不为0,但是我们这四个线路进入的条件都有一个下一个数为零的条件,所以如果取到等号,16这个数无法进入任何一个小循环,cont无法+1,cont会一直是16
三:代码
#include <stdio.h>
//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;
}
文章来源:https://blog.csdn.net/2301_80096514/article/details/135036622
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!