标签:ios ret TE def IV names 方向 mat str
给出一个扫雷地图(大家肯定都玩过),让你求这个地图是否合法。 对于地图是否合法有两个规则:
这道题就是验证扫雷内部的东西对不对,假如有一个(炸弹),那么它的八连通块都得加一,如果一个格子是\(0\)则显示“.”。于是只要找到然后用另一个数组把它周围都加一,最后两个数组比较一下即可。
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char maze[101][101];
int d[101][101];
int dx[8]= {-1,-1,-1,0,0,1,1,1},dy[8]= {-1,0,1,1,-1,-1,0,1}; //非常实用的方向数组(dfs很常见)
void add(int x,int y)
{
int i;
for(i=0; i<8; i++) //借助方向数组枚举8个方向
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]!='*')
d[nx][ny]=d[nx][ny]+1;
}
}
int main()
{
cin>>n>>m;
memset(d,0,sizeof(d)); //保险起见
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
cin>>maze[i][j];
}
} //读入
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(maze[i][j]=='*')
add(i,j); //假如有一个*(炸弹),那么它的八连通块都得加一
}
}
int k=0;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(maze[i][j]=='.'&&d[i][j]!=0)//如果这里是.但是d不为0,代表周围有雷,那么不合法(很巧妙)
{
k=1;
break;
}
else
if(maze[i][j]=='.')
continue;
else
if(maze[i][j]=='*')
continue;
else
if((int)(maze[i][j])-48!=d[i][j])//如果当前是数字,但是和预处理的不一样,照样不合法
{
k=1; //如果提前算出的地图上的
break;
}
}
}
if(k==0)//输出结果
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
}
标签:ios ret TE def IV names 方向 mat str
原文地址:https://www.cnblogs.com/lyfoi/p/9191427.html