走出迷宫


题目链接: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

示例

输入

3 3
S..
..E

3 3
S##
###
##E

输出

Yes
No

分析

本题为入门的搜索题,我们可以从起点开始广搜,分别记录起点到各个位置的距离,直到搜索至终点其距离可确定结束,或搜索完毕终点距离未被确定。
另外,本题广搜时使用的队列,其中存储的应该是一个点的坐标,为了简便,我用一个数字表示,该数字为 行编号*列数+列编号,使用时还原即可。

AC代码


#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int N,M;
int s,e;        //s记录起点 e记录终点
bool mp[500][500];              //记录地图
int dis[500][500];              //记录距离
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};  //表示搜索的四个方向
bool bfs(int start,int end)
{
    queue<int> a;               //广搜必备的队列
    a.push(start);
    while(!a.empty())
    {
        int temp=a.front();
        a.pop();
        int x=temp/M;           //由数字得到横纵坐标
        int y=temp%M;
        for(int i=0;i<4;i++)    //向四个方向试探
        {
            int newx=x+dir[i][0];
            int newy=y+dir[i][1];
            if(newx<0 || newy<0 || newx>=N || newy>=M) continue;
            if(!mp[newx][newy]) continue;
            if(dis[newx][newy]) continue;
            if(newx*M+newy==e) return true;
            dis[newx][newy]=dis[x][y]+1;
            a.push(newx*M+newy);
        }
    }
    return false;
}
int main()
{
    while(cin >> N >> M)
    {
        cin.get();
        memset(dis,0,sizeof(dis));
        memset(mp,0,sizeof(mp));
        for(int i=0;i<N;i++)
        {
            string temp;
            getline(cin,temp);
            for(int j=0;j<M;j++)
            {
                if(temp[j]=='#')
                {
                    mp[i][j]=false;
                    continue;
                }
                mp[i][j]=true;
                if(temp[j]=='S')
                    s=M*i+j;
                else if(temp[j]=='E')
                    e=M*i+j;
            }
        }
        if(bfs(s,e)) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}

文章作者: Kong Aobo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kong Aobo !
  目录