【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;  // 返回距离矩阵
    }
};
相关推荐
花火|3 小时前
算法训练营day37 动态规划⑤ 完全背包 518. 零钱兑换 II、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
算法·动态规划
Neil今天也要学习3 小时前
永磁同步电机无速度算法--脉振方波注入法
算法
小学生的信奥之路3 小时前
力扣1116题:用C++实现多线程交替输出零、偶数、奇数
c++·leetcode·多线程
绿炮火3 小时前
【MATLAB】(二)基础知识
开发语言·算法·matlab
老狼主4 小时前
MFC CChartCtrl编程
c++·mfc
88号技师4 小时前
2025年6月最新SCI-灰熊脂肪增长优化算法Grizzly Bear Fat Increase-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
玄月初二丶4 小时前
28. 找出字符串中第一个匹配项的下标
c语言·开发语言·数据结构·算法
qq_427506084 小时前
JavaScript和小程序写水印的方法示例
前端·算法·微信小程序
小猪扒饭4 小时前
C基础 12_day
c语言·笔记·学习·算法
新青年.4 小时前
cpp实现音频重采样8k->16k及16k->8k
c++