力扣HOT100之图论:994. 腐烂的橘子

这道题属于是BFS的模板题,很像病毒扩散的过程,之前在刷代码随想录的时候也刷过类似的题目,具体的BFS代码写法可以参照这篇博客我们需要统计出腐烂至全地图时所需的最少扩散次数,当然也存在有的橘子无法被腐烂的情况,因此我们需要先统计初始状态下的新鲜橘子个数,每当扩散一次,被扩散的新鲜橘子就变成腐烂橘子,并将新鲜的橘子数减去对应的数量,当扩散结束后,如果新鲜的橘子数量大于0,则说明无法腐烂所有的橘子,我们直接返回-1,否则就直接返回扩散的轮数。由于初始状态下的腐烂橘子可能不止一个,我们需要将初始状态下的腐烂橘子坐标添加到队列中,然后再开始扩散。扩散过程需要用两重while循环来实现,外层while循环每循环一次,就代表扩散了一次,内层while循环每循环一次,就是从当前的其中一个腐烂橘子向四周扩散了一次,被腐烂的橘子将加入队列,但是不会参与内层循环的过程,因为在内层循环腐烂的橘子并不是本轮的初始腐烂橘子,应当在下一次外层while循环中进行扩散。

cpp 复制代码
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int result = 0;
        //定义4个方向
        vector<vector<int>> dirs ={
            {0, 1},      //向右
            {0, -1},     //向左
            {1, 0},      //向下
            {-1, 0}      //向上
        };
        int m = grid.size(), n = grid[0].size();  //m行n列
        int fresh = 0;  //统计初始状态下新鲜橘子的数量
        queue<pair<int, int>> My_Queue;  //用于存放网格坐标
        //统计新鲜的橘子数量和腐烂橘子的初始位置
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(grid[i][j] == 1) 
                    fresh++;
                if(grid[i][j] == 2)
                    My_Queue.push({i, j});
            }
        }
        while(fresh > 0 && !My_Queue.empty()){
            int size = My_Queue.size();
            while(size > 0){
                pair<int, int> current = My_Queue.front();
                My_Queue.pop();
                size--;
                for(auto dir : dirs){
                    int next_x = current.first + dir[0];
                    int next_y = current.second + dir[1];
                    if((next_x < 0 || next_x >= m) || (next_y < 0 || next_y >= n))
                        continue;   //越界访问直接跳过
                    if(grid[next_x][next_y] == 1){
                        grid[next_x][next_y] = 2;
                        fresh--;
                        My_Queue.push({next_x, next_y});
                    }
                }
            }
            result++;
        }
        return fresh > 0 ? -1 : result;
    }
};
相关推荐
zyq99101_131 分钟前
PTA刷题笔记3(微难,有详解)
c语言·笔记·学习·算法
forwiat1 小时前
日拱一卒【6】
算法
Echo``1 小时前
6:OpenCV—图像滤波
c++·人工智能·opencv·算法·计算机视觉
阳洞洞1 小时前
leetcode 61. Rotate List和86. Partition List
leetcode·链表
phoenix@Capricornus2 小时前
极大似然估计
算法·机器学习·概率论
爱做ppt的阿伟2 小时前
101 alpha_59
算法
编程绿豆侠4 小时前
力扣HOT100之图论:200. 岛屿数量
算法·leetcode·图论
摆烂仙君4 小时前
腾讯2025年校招笔试真题手撕(一)
java·数据结构·算法
虾球xz4 小时前
游戏引擎学习第307天:排序组可视化
c++·学习·算法·游戏引擎