走出迷宫

走出迷宫

https://ac.nowcoder.com/acm/problem/14572

链接:https://ac.nowcoder.com/acm/problem/14572

题目描述

小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。
小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。 障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1);
小明想要知道,现在他能否从起点走到终点。

输入描述:

本题包含多组数据。
每组数据先输入两个数字N,M接下来N行,每行M个字符,表示地图的状态。
数据范围:2<=N,M<=500保证有一个起点S,同时保证有一个终点E.

输出描述:

每组数据输出一行,如果小明能够从起点走到终点,那么输出Yes,否则输出No

solution:

模板题,因为不用求起点到终点的最小距离,因此可以不用再设一个数组来记录具体,把遍历过的点直接在图上改就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
char tu[505][505];
int n,m;
bool bfs(int sx,int sy)
{
    queue <P> q;
    tu[sx][sy]='#';
    q.push(P(sx,sy));
    while(!q.empty())
    {
        P p=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            int x=p.first+dx[i],y=p.second+dy[i];
            if(x<0||x>=n||y<0||y>=m)continue;
            if(tu[x][y]=='#')continue;
            if(tu[x][y]=='E')return true;
            tu[x][y]='#';
            q.push(P(x,y));
        }
    }
    return false;
}
int main()
{
    while(cin>>n>>m)
    {
        for(int i=0;i<n;i++)
            cin>>tu[i];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(tu[i][j]=='S')
                {
                    if(bfs(i,j))
                        cout<<"Yes\n";
                    else
                        cout<<"No\n";
                }
            }
        }
    }
}
全部评论

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务