宽度优先搜索


BFS(宽度优先搜索)

宽度优先搜索最大的优势是可以搜索到最短路,然而在空间上要比DFS上大一些。BFS是一层一层向外搜索,先搜索所有距离为1的点,再搜索所有距离为2的点,以此类推,所以搜到的点是逐渐离我们越来越远的,找到的第一个即为最小,前提是图的边的权重都为1。

走迷宫

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> PII;

const int N = 110;

int n, m;
int g[N][N], d[N][N]; // g用于读取地图,d兼具判重和计算长度两种功能。

int bfs()
{
    queue <PII> q; // 用队列存储每一次走到的点

    memset(d, -1, sizeof d); // 初始化,用于后续判重.
    d[0][0] = 0; // 原点的距离是0.
    q.push({0, 0}); // 以原点开始查找

    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 表示该点向四个方向走的可能的情况。

    while (q.size()){
        auto t = q.front(); // 每次取出队头的点,进行四个方向的查找
        q.pop(); // 将队列中的该点删除.

        for (int i = 0; i < 4; i ++ ){
            int x = t.first + dx[i], y = t.second + dy[i];

            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; // 用该点存放距离,t里的点为上次的点,表示从t点走到(x,y)这个点,因此距离加一。
                q.push({x, y}); // 将该点推入队列,等待继续往后走.
            }
        }
    }
    return d[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;
}

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