题目
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
解题思路
使用广度优先遍历,将每一轮会腐烂到的橘子遍历出来,直到没有橘子会腐烂为止。
代码解析
func orangesRotting(grid [][]int) int {
type pair struct{x, y int}
var dirs = []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
var m,n = len(grid), len(grid[0])
var queue, good = []pair{}, 0
for x:= 0 ; x < m ; x++ {
for y:=0;y<n;y++{
if grid[x][y] == 2 {
queue = append(queue, pair{x,y})
} else if grid[x][y] == 1 {
good++
}
}
}
if good > 0 && len(queue) == 0 {
return -1
}
if good == 0 || len(queue) == 0 {
return 0
}
count := 0
for len(queue) != 0 {
tmp := queue
queue = nil
count++
for _, p := range tmp{
for _, dir := range dirs {
x, y := p.x + dir.x, p.y + dir.y
if x >=0 && x < m && y>= 0 &&y < n && grid[x][y] == 1 {
good--
grid[x][y] = 2
queue = append(queue, pair{x,y})
}
}
}
}
if good != 0 {
return -1
}
return count-1
}
有几个注意点。
首先,基于题目可知,是存在可能有橘子不会被腐烂到的情况的。所以要对还完好的橘子数量进行统计,遍历完后还有完好的橘子就需要返回 -1 。
其次,遍历时要防止越界,不然会导致报错。
最后,要记得将橘子腐烂,防止重复查找。