宁波工程学院2020新生校赛G

链接: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;
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294243.html