宁波工程学院2020新生校赛G - 遗迹逃亡(基础BFS)
链接:https://ac.nowcoder.com/acm/contest/6106/G
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
为了寻找稀有的宝可梦,小梁进了一个古代遗迹中。在一次意外的触发之下,她复活了超古代宝可梦化石翼龙并激怒了对方,现在化石翼龙准备攻击小梁,她要逃离这个遗迹了。
但化石翼龙的实力过于强大,让这个本就历经风霜的遗迹开始了毁灭性的崩塌,有大量的落石下落,现在我们要帮助小梁逃离这个遗迹。
遗迹是一个N x M 的矩阵,g表示该遗迹的出口;s表示小梁所处位置;现在遗迹中有大量落石正在下落。因为小梁不能翻越这些落石,所以必须绕开,同时小梁只能走上下左右4个方向。
现在小梁要开始逃亡了,那么小梁可以顺利逃出遗迹吗?
输入描述:
第一行两个整数 N, M(1≤N,M≤500)
输入一个 N×M的矩阵:
.表示道路;
#表示落石的位置;
s表小梁所处位置;
g表遗迹的出口 。
输出描述:
如果小梁能顺利逃出遗迹则输出 “Yes”,反之输出 “No”(不包括引号)。
示例1
输入
10 10
s…
#########.
#…#.
#…####.#.
##.##.#.#.
##.##.#.#.
g…#.#.#.
#.#.#.#.#.
#.#.#.#.#.
#…#…
输出
Yes
题目大意:
给出一个地图,#不能走,询问是否能从s走到g,能输出yes,不能输出no
解题思路:
基础搜索,我用的BFS,设一个标记数组结合搜索的模板即可AC:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
using namespace std;
const int _max=550;
char mp[_max][_max];
bool book[_max][_max];
int dir[][2]={1,0,-1,0,0,1,0,-1};
bool flag;
int n,m,xx,yy;
struct node{int x,y; };
void bfs()//bfs模板
{
memset(book,false,sizeof book);
queue<node >q;
q.push(node({xx,yy}));
while(!q.empty())
{
auto t=q.front();
if(mp[t.x][t.y]=='g')//找到出口return;
{
flag=true;
return;
}
for(int k=0;k<4;k++)
{
int nx=t.x+dir[k][0];
int ny=t.y+dir[k][1];
if(nx<0||nx>n-1||ny<0||ny>m-1)
continue;
if(!book[nx][ny]&&mp[nx][ny]!='#')
{
book[nx][ny]=true;
q.push(node({nx,ny}));
}
}
q.pop();
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='s')
xx=i,yy=j;
}
flag=false;
bfs();
cout<<(flag?"Yes":"No")<<endl;
//system("pause");
return 0;
}