lc-go/solutions/9/q994/solution.go
2026-01-25 11:56:12 +09:00

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