|
1 | 1 | package rotting_oranges |
2 | 2 |
|
3 | 3 | func orangesRotting(grid [][]int) int { |
4 | | - r, c := len(grid), len(grid[0]) |
5 | | - hasFresh, isRotten, rottens := false, false, make([]int, 0) |
| 4 | + r, c, minutes := len(grid), len(grid[0]), 0 |
| 5 | + freshCount, rottens := 0, make([]int, 0) |
6 | 6 | for i := 0; i < r; i++ { |
7 | 7 | for j := 0; j < c; j++ { |
8 | | - if !hasFresh && grid[i][j] == 1 { |
9 | | - hasFresh = true |
| 8 | + if grid[i][j] == 1 { |
| 9 | + freshCount++ |
10 | 10 | } else if grid[i][j] == 2 { |
11 | 11 | rottens = append(rottens, i*c+j) |
12 | 12 | } |
13 | 13 | } |
14 | 14 | } |
15 | | - for _, p := range rottens { |
16 | | - i, j := p/c, p%c |
17 | | - for k := 0; k < 4; k++ { |
18 | | - nr, nc := i+k-1, j+k-2 |
19 | | - if k == 0 { |
20 | | - nc += 2 |
21 | | - } else if k == 3 { |
22 | | - nr -= 2 |
23 | | - } |
24 | | - if 0 <= nr && nr < r && 0 <= nc && nc < c && grid[nr][nc] == 1 { |
25 | | - grid[nr][nc], isRotten = 2, true |
| 15 | + for l := len(rottens); l > 0 && freshCount > 0; l = len(rottens) { |
| 16 | + for _, p := range rottens { |
| 17 | + for k := 0; k < 4; k++ { |
| 18 | + i, j := p/c+k-2, p%c+k-1 |
| 19 | + if k == 0 { |
| 20 | + i += 2 |
| 21 | + } else if k == 3 { |
| 22 | + j -= 2 |
| 23 | + } |
| 24 | + if 0 <= i && i < r && 0 <= j && j < c && grid[i][j] == 1 { |
| 25 | + grid[i][j], freshCount, rottens = 2, freshCount-1, append(rottens, i*c+j) |
| 26 | + } |
26 | 27 | } |
27 | 28 | } |
| 29 | + minutes, rottens = minutes+1, rottens[l:] |
28 | 30 | } |
29 | | - if !hasFresh { |
30 | | - return 0 |
31 | | - } else if !isRotten { |
32 | | - return -1 |
33 | | - } |
34 | | - ans := orangesRotting(grid) |
35 | | - if ans == -1 { |
| 31 | + if freshCount > 0 { |
36 | 32 | return -1 |
37 | 33 | } |
38 | | - return ans + 1 |
| 34 | + return minutes |
39 | 35 | } |
0 commit comments