AcWing 756. 蛇形矩阵(简单易懂的 while 循环 ) 瞅一眼?
原题链接
简单
作者:
大锤
,
2020-05-08 10:05:22
,
所有人可见
,
阅读 4289
蛇形填数(C++实现) 用的是刘汝佳紫书的源码
- 该算法就四个循环,向右、向下、向左、向上;
- 移动合法判断:边界+0标记
(初始化二维数组为0,0作为未填过数的标记)
- 对了,博客链接挂一个 https://blog.csdn.net/qq_44296342/article/details/105975323
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 150;
int a[maxn][maxn];
int main()
{
int n, m;
cin >> n >> m;
memset(a, 0, sizeof(a));
int x = 0, y = 0; //初始坐标坐标,(0,0)
int cnt = 1; //初始化第一个数
a[x][y] = cnt;
while (cnt < n * m )
{
//用下一笔的位置来判断
//向右, 符合条件,则填入下一笔。____提前预判
while (y + 1 < m && !a[x][y + 1]) a[x][ ++ y] = ++ cnt;
//向下
while (x + 1 < n && !a[x + 1][y]) a[ ++ x][y] = ++ cnt;
//向左
while (y - 1 >= 0 && !a[x][y - 1]) a[x][ -- y] = ++ cnt;
//向上
while (x - 1 >= 0 && !a[x - 1][y]) a[ -- x][y] = ++ cnt;
}
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
cout << a[i][j] << " ";
// printf("%-5d", a[i][j]);
}
cout << endl;
}
return 0;
}
刘汝佳
为啥不是cnt<=n*m呢?
你想想,这个题解里的cnt最大等于mn对吧,也就是说我们要在这个时候让最外层的while停下,如果是cnt<=mn的话这个while永远停不下来,所以应该是cnt<m*n
为啥我打上就是死循环
cnt<=m*n 就会死循环
当时基础不好,在刘汝佳书那里浪费了好多时间
我是今年寒假期间看的紫书,其实没看懂多少(/捂脸)
while (y + 1 < m && !a[x][y + 1])这里边的y+1 和[y+1]有啥区别?不明白
明白了,你这是直接把数值输入到相应的位置然后顺次输出的啊。
这个不是紫书里面的吗……
对
头像选的好,访客少不了!
hhh