0
点赞
收藏
分享

微信扫一扫

【BFS】走迷宫

洲行 2022-03-11 阅读 49

分析:

宽搜,权值为1,特殊的最短路

1、基本思路

 2、代码

#include <iostream>
#include <algorithm>
#include <cstring>//memset
#include <queue>
using namespace std;

const int N = 110;
//1、定义,g[][]存储地图,d[][]存储每个点到起点的距离
int g[N][N] , d[N][N];
//2、定义一个pair队列
typedef pair<int,int> PII;
queue<PII> q;

int n , m;

//3、宽搜
int bfs()
{
    //1.pair结构队列里面装的就是能够扩展的每个点的坐标
    
    q.push({0,0});  //宽搜的起点放入队列
   
    memset( d , -1 , sizeof d );//初始化距离为-1,表示这个点还没走过
    d[0][0] = 0 ;//初始起点距离为0
    
    //2.while循环,队列不空,取队头
    int dx[4] = {-1 , 1 , 0, 0} , dy[4] = {0 , 0, -1 ,1};//向量表示向上,下,左,右
    while( q.size() )
    {
        auto t = q.front();
        q.pop();
        //3.枚举一下四个位置
        for( int i = 0 ; i<4 ; i++ )
        {
            int x = t.first + dx[i] , y = t.second + dy[i];
            //4.没出边界并且这个点是空地并且还没有走过的话,才能扩展这个点
            if(x>=0 && x<n && y>=0 && y<m && g[x][y] == 0 && d[x][y] == -1)
            {
                d[x][y] = d[t.first][t.second] + 1;
                q.push({x , y});//将能够扩展的点都插入队列中,
            }
        }
    }
    //4.第一次搜到终点的就是最短距离
    return d[n-1][m-1];//下标0开始存储,下标[n-1][m-1]对应最右下角的位置
}


int main()
{
    cin>>n>>m;
    for( int i = 0 ; i<n ; i++ )
        for( int j = 0 ; j<m ; j++ )
            cin>>g[i][j];

    cout<< bfs() <<endl;
    return 0;
}

 3、模拟过程

举报

相关推荐

0 条评论