在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
python3版
import collections
def orangesRotting(grid):
R, C = grid.__len__(), grid[0].__len__()
queue = collections.deque()
for r, row in enumerate(grid):
for c, val in enumerate(row):
if val == 2:
queue.append((r, c, 0))
def neighbors(r, c):
for nr, nc in ((r - 1, c), (r, c - 1), (r + 1, c), (r, c + 1)):
if 0 <= nr < R and 0 <= nc < C:
yield nr, nc
d = 0
while queue:
r, c, d = queue.popleft()
for nr, nc in neighbors(r, c):
if grid[nr][nc] == 1:
grid[nr][nc] = 2
queue.append((nr, nc, d + 1))
if any(1 in row for row in grid):
return -1
return d
scala版
object Solution {
def orangesRotting(grid: Array[Array[Int]]): Int = {
import scala.collection.mutable
val line:Int = grid.length // 计算行数
val column:Int = grid(0).length // 计算列数
var queue:mutable.Queue[Array[Int]] = mutable.Queue() // 创建队列
var step:Int = 0 // 总共的步长
// 循环取出所有一开始状态就腐烂(2)的橘子,存入队列queue中
for (i <- 0 until line) {
for (j <- 0 until column) {
if (grid(i)(j) == 2) {
queue += Array(i,j,step)
}
}
}
def RO(i:Int,j:Int,step:Int): Unit = {
for ((c,l) <- Array((i-1,j),(i,j-1),(i+1,j),(i,j+1))){
if (0 <= c && c < line && 0 <= l && l < column){
if (grid(c)(l) == 1) {
grid(c)(l) = 2
queue += Array(c,l,step+1)
}
}
}
}
while (queue.nonEmpty) {
val a = queue.dequeue
val m = a(0) // 腐烂橘子的行坐标
val n = a(1) // 腐烂橘子的列坐标
step = a(2) // 腐烂橘子的轮数
RO(m,n,step) // 刷新下一轮被腐烂橘子的信息
}
for (cowLast <- grid){
if (cowLast.contains(1)){
step = -1
}
}
step
}
}