Leetcode994. 腐烂的橘子-----多源广度优先搜索

题目表述

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

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。
  • 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

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

示例:

输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
输出:4

多源广度优先搜索

BFS 可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。BFS 先搜索到的结点,一定是距离最近的结点

多源BFS就是以多个节点同时作为起点,记录每一层的节点个数,同时遍历每一层的节点。具体做法是把所有已腐烂的橘子坐标放入队列,然后逐渐腐蚀左右前后四个方向的橘子(假如存在的话),把鲜橘坐标放入队列,并把鲜橘的1改为2,即已腐烂,防止来回搜超时;直到队列空为止。

class Solution {
    public int orangesRotting(int[][] grid) {
        Deque<int[]> que = new ArrayDeque<>();
        int good = 0;
        int bad = 0;
        int minute = 0;
        int[][] dirs = {{1,0}, {0,-1}, {0,1},{-1,0}};
        for(int i = 0; i < grid.length;i++){
            for(int j = 0; j < grid[0].length;j++){
                if(grid[i][j] == 2) que.offer(new int[]{i,j});
                if(grid[i][j] == 1) good += 1;
            }
        }
        while(good !=0 && !que.isEmpty()){
            int size = que.size();
            for(int i = 0; i < size; i++){
                int[] cur = que.poll();
                int curx = cur[0];
                int cury = cur[1];
                for(int[] dir : dirs){
                    int x = dir[0] + curx;
                    int y = dir[1] + cury;
                    if(x < 0 || y < 0 || x >= grid.length|| y>=grid[0].length) continue;
                    if(grid[x][y] == 0 || grid[x][y] == 2) continue;
                    if(grid[x][y] == 1){
                        que.offer(new int[]{x,y});
                        grid[x][y] = 2;
                        good -= 1;
                    }
                }
            }
            
            minute += 1;

        }
        return good==0 ? minute : -1;
    }
}
posted @ 2022-06-04 22:32  YoungerWb  阅读(31)  评论(0编辑  收藏  举报