腐烂的橘子BFS

题目: 腐烂的橘子

在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;

值 1 代表新鲜橘子;

值 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。

解题思路:

这道题可以使用广度优先搜索(BFS)来解决。我们首先将所有初始状态为腐烂的橙子加入队列,然后进行广度优先搜索。在每一轮搜索中,我们从队列中取出腐烂的橙子,尝试向上下左右四个方向传播腐烂。如果某个方向上有新鲜橙子,我们将其变为腐烂橙子,并将其位置加入队列。重复这个过程直到队列为空,即所有可能的腐烂传播都完成。

代码:

java 复制代码
public class OrangesRotting {
    int[][] xx = {{0, -1},{-1, 0}, {0, 1}, {1, 0}};
    /**
     * 计算腐烂的橙子数量。
     *
     * @param grid 二维数组表示果园的状态,1 代表新鲜橙子,2 代表腐烂橙子,0 代表空格。
     * @return 如果所有新鲜橙子都腐烂了,返回腐烂过程需要的最小天数;如果无法全部腐烂,则返回 -1。
     */
    public int orangesRotting(int[][] grid) {
        // 获取果园的行数和列数
        int m = grid.length, n = grid[0].length, res = 0;
        // 使用队列保存腐烂橙子的位置,以便进行广度优先搜索
        Queue<int[]> queue = new LinkedList<>();

        // 将所有初始状态为腐烂的橙子加入队列
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(grid[i][j] == 2) queue.offer(new int[]{i,j});
            }
        }

        // 广度优先搜索,直到队列为空
        while(!queue.isEmpty()){
            // 当前队列中的橙子数量
            int size = queue.size();
            // 标记当前是否有橙子腐烂
            boolean flag = false;

            // 遍历当前队列中的所有橙子
            for(int i = 0;i < size;i++){
                int[] d = queue.poll();
                int x = d[0], y = d[1];

                // 尝试从当前腐烂橙子的位置向四个方向传播腐烂
                for(int[] t : xx){
                    int xx = x + t[0], yy = t[1] + y;
                    // 跳过越界的橙子、已经是腐烂的橙子和空格
                    if(xx < 0 || yy < 0 || xx == m || yy == n
                            || grid[xx][yy] == 0 || grid[xx][yy] == 2) continue;

                    // 将新鲜橙子变为腐烂橙子,并将其位置加入队列,标记腐烂发生
                    grid[xx][yy] = 2;
                    flag = true;
                    queue.offer(new int[]{xx,yy});
                }
            }
            // 如果本次有橙子腐烂,则结果加一
            if(flag) res++;
        }

        // 检查果园中是否还有新鲜橙子,有则返回 -1,表示无法全部腐烂
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(grid[i][j] == 1) return -1;
            }
        }
        return res;
    }
}
相关推荐
_深海凉_6 分钟前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录1 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre4 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre6 小时前
739 每日温度
算法·leetcode·职场和发展
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙9807 小时前
day37-数据结构力扣
数据结构·算法·leetcode
6Hzlia10 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
m0_6294947310 小时前
LeetCode 热题 100-----13.最大子数组和
数据结构·算法·leetcode
田梓燊11 小时前
力扣:94.二叉树的中序遍历
数据结构·算法·leetcode
khalil102011 小时前
代码随想录算法训练营Day-38动态规划06 | 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包、总结
数据结构·c++·算法·leetcode·动态规划