描述
有一个 n×m 的棋盘(1<n,m≤100),棋盘上有侍卫和宝藏,在棋盘的左上角(1,1) 开始寻找宝藏,如果能避开侍卫找到宝藏输出 YES
,否则输出 NO
。注意:左上角不一定是 ‘.’
(安全通行)。
输入描述
输入有一组测试数据,以两个非零整数 n 和 m 开始,两者均不超过 100。n 表示迷阵行数, m 表示迷阵列数。接下来有 n 行, 每行包含 m 个字符,不同字符分别代表不同含义:‘.’
可以安全通行的方格。‘#’
有守卫的方格。‘*’
宝藏所在位置。
输出描述
找到宝藏输出 YES
,否则输出 NO
。
样例输入 1
5 6 . . # . . . . . . # . . . . . # . . # . . . . . # # # . * .
样例输出 1
YES
样例输入 2
4 4 # . . . . . . . . . . * . . . .
样例输出 2
NO
提示
数据范围与提示
1<n,m≤100
#include<bits/stdc++.h>
using namespace std;
struct node{
int x;
int y;
};
queue<node>q;
char mp[101][101]={};
int vis[101][101]={};
int dx[4] ={1,0,-1,0};
int dy[4] ={0,1,0,-1};
int n,m;
void bfs(){
node a={1,1};
q.push(a);
vis[1][1]=1;
while(q.empty()!=1){
node f=q.front();
if(mp[f.x][f.y]=='*'){
cout<<"YES";
return;
}
for(int i=0;i<4;i++){
int nx=f.x+dx[i];
int ny=f.y+dy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=m&&vis[nx][ny]==0&&mp[nx][ny]!='#'){
vis[nx][ny]=1;
node r={nx,ny};
q.push(r);
}
}
q.pop();
}
cout<<"NO";
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
if(mp[1][1]=='#'){
cout<<"NO";
return 0;
}
bfs();
return 0;
}