题目连接:牛客 遗迹逃亡
基础迷宫类bfs广搜题
题目描述
为了寻找稀有的宝可梦,小梁进了一个古代遗迹中。在一次意外的触发之下,她复活了超古代宝可梦化石翼龙并激怒了对方,现在化石翼龙准备攻击小梁,她要逃离这个遗迹了。
但化石翼龙的实力过于强大,让这个本就历经风霜的遗迹开始了毁灭性的崩塌,有大量的落石下落,现在我们要帮助小梁逃离这个遗迹。
遗迹是一个\text{N * M}N * M 的矩阵,\text{g}g表示该遗迹的出口;\text{s}s表示小梁所处位置;现在遗迹中有大量落石正在下落。因为小梁不能翻越这些落石,所以必须绕开,同时小梁只能走上下左右4个方向。
现在小梁要开始逃亡了,那么小梁可以顺利逃出遗迹吗?
输入描述
第一行两个整数 N, M (1\leq N,M \leq 500)N,M(1≤N,M≤500) 输入一个
\text{N×M}N×M的矩阵: \text{.}.表示道路; 表示落石的位置; \text{s}s表小梁所处位置;
\text{g}g表遗迹的出口 。
输出描述
如果小梁能顺利逃出遗迹则输出 “Yes”,反之输出 “No”(不包括引号)。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
char s[505][505];
int vis[505][505];
int n,m,l,r,f;
void bfs(int l,int r)
{
if(s[l][r]=='#'||l<1||l>n||r<1||r>m||vis[l][r])return ;
if(s[l][r]=='g'){
f=1;return ;
}
vis[l][r]=1;
bfs(l-1,r);
bfs(l+1,r);
bfs(l,r-1);
bfs(l,r+1);
//vis[l][r]=0;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>s[i][j];
if(s[i][j]=='s')l=i,r=j;
}
bfs(l,r);
if(f)cout<<"Yes";
else cout<<"No";
return 0;
}