【C++算法】89.多源BFS_01 矩阵

文章目录


题目链接:

542. 01 矩阵


题目描述:


解法

先看懂题目

解法一:一个位置一个位置求(最差的情况下会非常恐怖)

解法二:多源BFS+正难则反

把1当成起点就很难,因为不好更新。

所以把0当作起点,1当作终点,从0开始向外扩展,遇到1就把最短路数填进去。

  1. 把所有的0位置加入到队列中
  2. 一层一层的向外扩展即可

其他注意:

  1. 需要一个bool数组来标记当前位置是否搜索过。

  2. 层序遍历的循环里面要求一个[step,sz]的,和一个dist[][]数组记录最终结果,这题我们可以把bool数组,[step,sz]都放进dist[][]数组

    • 把dist的值都初始化为-1,来标记没有搜索过,代替bool数组
    • 值和层数都可以填入dist[][]数组

C++ 算法代码:

cpp 复制代码
class Solution {
    // 四个方向的移动:右、左、下、上
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};

public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {
        int m = mat.size(), n = mat[0].size();

        // 初始化距离矩阵
        // dist[i][j] == -1 表示该位置还未被访问
        // dist[i][j] != -1 表示该位置到最近0的距离
        vector<vector<int>> dist(m, vector<int>(n, -1));
        queue<pair<int, int>> q;
        
        // 1. 多源BFS初始化:将所有0的位置作为起点
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (mat[i][j] == 0) {
                    q.push({i, j});
                    dist[i][j] = 0;  // 0到自己的距离是0
                }

        // 2. 开始BFS遍历
        while (q.size()) {
            auto [a, b] = q.front();
            q.pop();
            
            // 遍历四个方向
            for (int i = 0; i < 4; i++) {
                int x = a + dx[i], y = b + dy[i];
                
                // 检查新位置是否在矩阵范围内且未被访问过
                if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1) {
                    // 更新距离:当前点的距离 = 前一个点的距离 + 1
                    dist[x][y] = dist[a][b] + 1;
                    // 将新位置加入队列,继续BFS
                    q.push({x, y});
                }
            }
        }
        return dist;  // 返回距离矩阵
    }
};
相关推荐
Q一件事36 分钟前
RWEQ——保留与消去P的soil_loss联合推导
算法
键盘会跳舞1 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
HugoStudio_SWAN1 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪
那年窗外下的雪.1 小时前
AIDC 学习日志|第 20 天|多归属业务验收与哈希不均定位
学习·算法·哈希算法
jimy12 小时前
C++ 的 “移动语义”——Move Semantics
开发语言·c++
s_w.h3 小时前
【 刷题 】双指针
算法
啥都想学点的研究生3 小时前
一篇文章讲清楚:K-Means聚类算法
算法·kmeans·聚类
白狐_7983 小时前
408 数据结构|KMP做题方法:next、nextval和高频易错点
数据结构·算法
月华路3 小时前
《模型不玄学》第20章 两种评估视角
人工智能·算法·机器学习