多源广度优先搜索
多源广度优先搜索和广度优先搜索的区别就是前者有多个源头,而后者只有一个源头。
994. 腐烂的橘子 - 力扣(LeetCode) (leetcode-cn.com)这道题目就是一个典型的多源广度优先遍历题目。
腐烂的橘子每分钟都会使周围相邻4个方向的橘子腐烂,返回使得所有橘子都腐烂的最短时间。这道题的关键是某一时刻网格中的所有腐烂橘子的重要性都是相同的,它们都会影响周围的好橘子。所以在程序中,需要把每一时刻的所有腐烂橘子(不包括上一时刻的腐烂橘子)都统计完,这样才能确定下一时刻的所有腐烂橘子(不包括当前时刻的腐烂橘子)。队列用来存储腐烂橘子的位置。
public int orangesRotting(int[][] grid) { /** * likou--994 腐烂的橘子 */ int m = grid.length,n = grid[0].length; Queue<int[]> queue = new ArrayDeque<>(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if(grid[i][j]==2){ queue.add(new int[]{i,j}); } } } int res = 0; int[][] dirs = new int[][]{{1,0},{-1,0},{0,1},{0,-1}}; while(!queue.isEmpty()){ int size = queue.size();//这里比较重要,因为这里是同一批的腐烂橘子 boolean used = false; for (int i = 0; i < size; i++) { int[] polled = queue.poll(); int x = polled[0], y = polled[1]; for (int[] dir : dirs) { int dx = x+dir[0],dy = y+dir[1]; if(dx<0 || dx>=m || dy<0 || dy>=n || grid[dx][dy]==0 || grid[dx][dy]==2) continue; grid[dx][dy]++; used = true; queue.add(new int[]{dx,dy}); } } if(used) res++; } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if(grid[i][j]==1) return -1; } } return res; }
分享知识,快乐自己!