【C++/BFS】走出迷宫

244 阅读1分钟

题目描述

小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个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

思路

走迷宫类型搜索题,算是一个模板题。用BFS解决即可。没有什么约束条件。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1000;
char mp[maxn][maxn];//迷宫地图
int vis[maxn][maxn];//标记数组,标记某处是否已经访问过(来过)
int n,m;
int dir[][2]={
        {0,-1},//上
        {0,1},//下
        {-1,0},//左
        {1,0}//右
};//方向数组,来控制行走的方向
struct node
{
    int x,y;
}s,e;//s为开始位置  e为结束位置  记录二者坐标

void init()//因为有多组数据,需要每次都初始化一下vis数组
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            vis[i][j]=0;
        }
    }
}

bool check(int x,int y)//检查x y是否合法
{
    if(vis[x][y])
        return true;
    if(x<0||x>n-1||y<0||y>m-1)
        return true;
    return false;
}

bool bfs()//BFS模板
{
    queue<node> que;
    que. push(s);
    vis[s.x][s.y]=1;
    while(!que.empty())
    {
        node head=que.front();
        que.pop();
        if(head.x==e.x&&head.y==e.y)//已经找到了出口 返回true
            return true;
        for(int i=0;i<4;i++)
        {
            int nx=head.x+dir[i][0];
            int ny=head.y+dir[i][1];
            if(check(nx,ny))
                continue;
            vis[nx][ny]=1;
            que. push({nx,ny});
        }
    }
    return false;//如果执行到这里,说明没能找到出口就false
}

int main()
{

    while(~scanf("%d %d",&n,&m))//输入多组 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')//标记开始位置 下同
                {
                    s.x=i;
                    s.y=j;
                }
                else if(mp[i][j]=='E')
                {
                    e.x=i;
                    e.y=j;
                }
                else if(mp[i][j]=='#')
                {
                    vis[i][j]=1;
                }

            }
        }
        if(bfs())
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
        init();
    }
    return 0;
}

//2022.4.21 BFS模板题