【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;  // 返回距离矩阵
    }
};
相关推荐
我笑了OvO13 小时前
C++类和对象(1)
java·开发语言·c++·类和对象
virtual_k1smet14 小时前
#等价于e * d ≡ 1 mod φ(n) #模逆元详解
人工智能·算法·机器学习
可触的未来,发芽的智生14 小时前
新奇特:神经网络的集团作战思维,权重共享层的智慧
人工智能·python·神经网络·算法·架构
_屈臣_14 小时前
卡特兰数【模板】(四个公式模板)
c++·算法
渡我白衣15 小时前
C++ 异常处理全解析:从语法到设计哲学
开发语言·c++·面试
坚持编程的菜鸟15 小时前
LeetCode每日一题——交替合并字符串
c语言·算法·leetcode
青草地溪水旁15 小时前
设计模式(C++)详解——观察者模式(Observer)(1)
c++·观察者模式·设计模式
悦悦子a啊15 小时前
[Java]PTA: jmu-Java-02基本语法-08-ArrayList入门
java·开发语言·算法
xlq2232216 小时前
12.排序(上)
数据结构·算法·排序算法
奔跑吧邓邓子16 小时前
【C++实战(62)】从0到1:C++打造TCP网络通信实战指南
c++·tcp/ip·实战·tcp·网络通信