题解 CF984B 【Minesweeper】
Hemingway
2019-05-23 12:48:12
~~我还是太弱了~~
纯模拟,判断每一个数字周围雷的数量是否与原地图相等(空视为0)
### 注意换行
不写边界判断~~我太懒了~~,因此读入时下标起始为1
下面贴代码
```cpp
#include<iostream>
using namespace std;
char map[200][200];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='.')map[i][j]='0';
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(map[i][j]=='*')continue;
int tmp=0;
for(int k=-1;k<=1;k++)
for(int t=-1;t<=1;t++)
{
if(k==t&&k==0)continue;
if(map[i+k][j+t]=='*')tmp++;
}
if((map[i][j]-'0')!=tmp)
{
cout<<"NO\n";
return 0;
}
}
cout<<"YES\n";
return 0;
}
```
其实还可以设一个数组
`
const move[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
`
然后原k,t的循环改为
```
for(int k=0;k<8;k++)
if(map[i+move[k][0]][j+move[k][1]]=='*')tmp++;
```
该题数据范围可以是$1<m,n<3500$
[另一道题](https://www.luogu.org/problemnew/show/CF404D
)