用BFS解决迷宫最短路径问题

走出迷宫

现在给你一个迷宫的图纸,图纸中只包含"."、"#"
“.”表示路
“#”表示墙
左上角为入口,右下角为出口
现在问如果可以从入口走到出口的话,直接输出最小距离,如果不能走到,就输出-1

输入

每组数据占多行
第一行包含两个数字n、m(1<=n,m<=100),表示地图大小为n行m列
接下来n行每行m个字符,只包含“.”和“#”
保证入口和出口均为路

输出

每组输出占一行,包含一个整数,表示答案

样例输入

3 4
..#.
#...
##..

样例输出

5
#include<bits/stdc++.h>
using namespace std;
char ch[505][505];//迷宫
int vis[505][505];//标识
int dis[4][2]= {-1,0,0,1,0,-1,1,0};//上下左右
struct node
{
    int x,y,step=0;
} A;//当前位置点坐标
int n,m;

bool judge(node xx);
void BFS();

int main()
{
    while(cin>>n>>m)
    {
        for(int i=0; i<n; i++) scanf("%s",ch[i]);//输入迷宫
        memset(vis,0,sizeof(vis));//标记数组清零
        BFS();
    }
    return 0;
}

bool judge(node xx)
{
    if(xx.x>=0 && xx.x<n && xx.y>=0 && xx.y<m && !vis[xx.x][xx.y] && ch[xx.x][xx.y]!='#')
        return true;//这个点,不超过边界、未被标记、且不是障碍物x
    return false;
}
void BFS()
{
    node start;//左上角起点
    start.x=0;
    start.y=0;
    start.step=0;
    queue<node>qu;
    while(!qu.empty()) qu.pop();
    qu.push(start);
    while(!qu.empty())
    {
        node now=qu.front();
        qu.pop();
        if(now.x==n-1 && now.y==m-1)
        {
            printf("%d\n",now.step);//到终点,输出步数
            return;
        }

        for(int i=0; i<4; i++) //判断四个方向能否向下继续走
        {
            node next;//每次新定义一个node
            next.x=now.x+dis[i][0];//[0]是x
            next.y=now.y+dis[i][1];//[1]是y
            if(judge(next))
            {
                next.step=now.step+1;//!!每次进行一层BFS,步数加1
                qu.push(next);
                vis[next.x][next.y]=1;
            }
        }
    }
    printf("-1\n");//若栈为空,即当前无路可走,输出-1
}


发布了51 篇原创文章 · 获赞 7 · 访问量 7477

猜你喜欢

转载自blog.csdn.net/Jason6620/article/details/89471559