腐烂的橘子 - 多源广度优先搜索
func orangesRotting(grid [][]int) int {
n := len(grid)
m := len(grid[0])
ans := 0
freshOrangesCount := 0
queue := [][2]int{}
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
if grid[i][j] == 1 {
freshOrangesCount++
} else if grid[i][j] == 2 {
queue = append(queue, [2]int{ i, j })
}
}
}
for len(queue) > 0 {
size := len(queue)
for k := 0; k < size; k++ {
i := queue[k][0]
j := queue[k][1]
if i > 0 && grid[i - 1][j] == 1 {
grid[i - 1][j] = 2
freshOrangesCount--
queue = append(queue, [2]int{ i - 1, j })
}
if i < n - 1 && grid[i + 1][j] == 1 {
grid[i + 1][j] = 2
freshOrangesCount--
queue = append(queue, [2]int{ i + 1, j })
}
if j > 0 && grid[i][j - 1] == 1 {
grid[i][j - 1] = 2
freshOrangesCount--
queue = append(queue, [2]int{ i, j - 1 })
}
if j < m - 1 && grid[i][j + 1] == 1 {
grid[i][j + 1] = 2
freshOrangesCount--
queue = append(queue, [2]int{ i, j + 1 })
}
}
queue = queue[size:]
if len(queue) > 0 {
ans++
}
}
if freshOrangesCount > 0 {
return -1
}
return ans
}