【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;  // 返回距离矩阵
    }
};
相关推荐
NAGNIP12 小时前
一文搞懂机器学习中的特征降维!
算法·面试
NAGNIP12 小时前
一文搞懂机器学习中的特征构造!
算法·面试
Learn Beyond Limits12 小时前
解构语义:从词向量到神经分类|Decoding Semantics: Word Vectors and Neural Classification
人工智能·算法·机器学习·ai·分类·数据挖掘·nlp
你怎么知道我是队长13 小时前
C语言---typedef
c语言·c++·算法
带土113 小时前
5. enum(枚举)关键字在C/C++中的作用
c语言·c++
驴友花雕14 小时前
【花雕学编程】Arduino BLDC 之群体机器人协同探索
c++·单片机·嵌入式硬件·arduino bldc·群体机器人协同探索
驴友花雕14 小时前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统
Qhumaing14 小时前
C++学习:【PTA】数据结构 7-1 实验7-1(最小生成树-Prim算法)
c++·学习·算法
Z1Jxxx16 小时前
01序列01序列
开发语言·c++·算法