48 lines
861 B
Go
48 lines
861 B
Go
package q994
|
|
|
|
func orangesRotting(grid [][]int) int {
|
|
w, h := len(grid[0]), len(grid)
|
|
queue := make([][3]int, 0, w+h) // row, col, minute
|
|
nFresh, nRot := 0, 0
|
|
|
|
for r := range grid {
|
|
for c := range grid[0] {
|
|
switch grid[r][c] {
|
|
case 1:
|
|
nFresh++
|
|
case 2:
|
|
nRot++
|
|
queue = append(queue, [3]int{r, c, 0})
|
|
}
|
|
}
|
|
}
|
|
|
|
var rot = func(r, c, minute int) {
|
|
if r < 0 || c < 0 || r >= h || c >= w || grid[r][c] != 1 {
|
|
return
|
|
}
|
|
grid[r][c] = 2
|
|
nFresh--
|
|
nRot++
|
|
queue = append(queue, [3]int{r, c, minute})
|
|
}
|
|
|
|
minutes := 0
|
|
for ; len(queue) > 0; queue = queue[1:] {
|
|
cur := queue[0]
|
|
r, c, minute := cur[0], cur[1], cur[2]
|
|
minutes = max(minute, minutes)
|
|
|
|
rot(r, c+1, minute+1)
|
|
rot(r, c-1, minute+1)
|
|
rot(r+1, c, minute+1)
|
|
rot(r-1, c, minute+1)
|
|
}
|
|
|
|
if nFresh == 0 {
|
|
return minutes
|
|
}
|
|
return -1
|
|
}
|
|
|
|
var _ = orangesRotting
|