样例输入
1 8
w....#.g
样例输出
yes
解题思路:
两次搜索:
1.第一次对王子进行搜索,标记王子能到达的所有点。
2.第二次对公主进行搜索,如果公主能到达王子标记过的点,那么说明王子可以救出公主。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
bool vis[105][105][2];//标记王子和公主能够到达的点
char s[105][105];
void dfs(int x,int y,int kind){
if(x<0||x>=n||y<0||y>=m||vis[x][y][kind]||s[x][y]=='#'){
return;
}
vis[x][y][kind]=true;
dfs(x+(2-kind),y,kind);
dfs(x-(2-kind),y,kind);
dfs(x,y+(2-kind),kind);
dfs(x,y-(2-kind),kind);
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>s[i];
}
int x,y;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='w'){
x=i;
y=j;
break;
}
}
}
dfs(x,y,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='g'){
x=i;
y=j;
break;
}
}
}
bool ans=false;
dfs(x,y,1);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(vis[i][j][0]&&vis[i][j][1]){//如果王子和公主都能到达同一个点,则可以救出公主
ans=true;
}
}
}
if(ans){
cout<<"yes"<<endl;
}else{
cout<<"no"<<endl;
}
return 0;
}