func orangesRotting(grid [][]int) int {
/*
这题我学到了:
广度优先搜索的意义, 即矩阵中所有腐烂的橘子同时向四周扩张
*/
R, C := len(grid), len(grid[0])
rotting := [][]int{}
res := 0
for r := 0; r < R; r++ {
for c, v := range grid[r] {
if v == 2 {
rotting = append(rotting, []int{r,c,0})
}
}
}
d := [][]int{ {0,1},{0,-1}, {1,0}, {-1,0} }
for len(rotting) > 0 {
temp := [][]int{}
for _, rot := range rotting {
r, c := rot[0], rot[1]
res = rot[2]
for i := 0; i < 4;i++{
rr, cc := r+d[i][0], c+d[i][1]
if rr > -1 && rr < R && cc > -1 && cc < C {
if grid[rr][cc] == 1 {
grid[rr][cc] = 2
temp = append(temp, []int{rr, cc, res+1})
}
}
}
}
rotting = temp
}
for r := 0; r < R; r++ {
for _, v := range grid[r] {
if v == 1 {
return -1
}
}
}
return res
}