题解 CF984B 【Minesweeper】

Hemingway

2019-05-23 12:48:12

Solution

~~我还是太弱了~~ 纯模拟,判断每一个数字周围雷的数量是否与原地图相等(空视为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 )