You are given an m x ngrid where each cell can have one of three values:
0 representing an empty cell,
1 representing a fresh orange, or
2 representing a rotten orange.
Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return-1.
Example 1:
Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4
Example 2:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
Example 3:
Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j] is 0, 1, or 2.
Solution
Approach #0: BFS
var ( dx = []int{0, 1, 0, -1} dy = []int{1, 0, -1, 0})funcorangesRotting(grid [][]int) int {iflen(grid) ==0 {return0 } m, n :=len(grid), len(grid[0]) all1 :=0var queue [][]intfor i :=0; i < m; i++ {for j :=0; j < n; j++ {if grid[i][j] ==1 { all1++ }if grid[i][j] ==2 { queue =append(queue, []int{i, j}) } } }iflen(queue) ==0&& all1 ==0 {return0 } depth :=-1 count1 :=-len(queue)forlen(queue) >0 { size :=len(queue)for i :=0; i < size; i++ { x, y := queue[i][0], queue[i][1] count1++for j :=0; j <4; j++ { xx, yy := x+dx[j], y+dy[j]if xx >=0&& xx < m && yy >=0&& yy < n && grid[xx][yy] ==1 { grid[xx][yy] =2 queue =append(queue, []int{xx, yy}) } } } fmt.Println(all1, count1) depth++ queue = queue[size:] }if all1 > count1 {return-1 }return depth}