源题目

https://leetcode-cn.com/problems/rotting-oranges/

994. 腐烂的橘子

难度中等396
在给定的网格中,每个单元格可以有以下三个值之一:

  • 值 0 代表空单元格;
  • 值 1 代表新鲜橘子;
  • 值 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

示例 1:
广度/ 深度优先搜索--LeetCode 994. 腐烂的橘子 - 图1
输入:[[2,1,1],[1,1,0],[0,1,1]] 输出:4
示例 2:
输入:[[2,1,1],[0,1,1],[1,0,1]] 输出:-1 解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:
输入:[[0,2]] 输出:0 解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

  1. 1 <= grid.length <= 10
  2. 1 <= grid[0].length <= 10
  3. grid[i][j] 仅为 0、1 或 2

通过次数48,748
提交次数95,806

  1. class Solution(object):
  2. def orangesRotting(self, grid):
  3. """
  4. :type grid: List[List[int]]
  5. :rtype: int
  6. """
  7. m = len(grid)
  8. n = len(grid[0])
  9. dirs = ((1,0),(-1,0),(0,1),(0,-1))
  10. Q = []
  11. visited = set()
  12. minute = 0
  13. for i in range(m):
  14. for j in range(n):
  15. if grid[i][j] == 2:
  16. Q.append([i,j,minute])
  17. visited.add((i,j))
  18. while Q:
  19. i,j,minute = Q.pop(0)
  20. for k in range(4):
  21. x = i+dirs[k][0]
  22. y = j+dirs[k][1]
  23. if 0 <= x < m and 0 <= y < n and (x,y) not in visited and grid[x][y]!=0:
  24. grid[x][y] = 2
  25. Q.append((x,y,minute+1))
  26. visited.add((x,y))
  27. for i in range(m):
  28. for j in range(n):
  29. if grid[i][j] == 1:
  30. return -1
  31. return minute