131 lines
2.5 KiB
Go
131 lines
2.5 KiB
Go
package top100liked
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
// https://leetcode.cn/problems/rotting-oranges/?envType=study-plan-v2&envId=top-100-liked
|
|
|
|
type point struct {
|
|
Row int
|
|
Col int
|
|
}
|
|
|
|
// AC,成绩不错,但是写的比较复杂
|
|
// func getFreshOrangesAround(grid [][]int, p point) []point {
|
|
// m, n := len(grid), len(grid[0])
|
|
// r, c := p.Row, p.Col
|
|
// res := []point{}
|
|
// if r > 0 && grid[r-1][c] == 1 {
|
|
// res = append(res, point{r - 1, c})
|
|
// }
|
|
// if r < m-1 && grid[r+1][c] == 1 {
|
|
// res = append(res, point{r + 1, c})
|
|
// }
|
|
// if c > 0 && grid[r][c-1] == 1 {
|
|
// res = append(res, point{r, c - 1})
|
|
// }
|
|
// if c < n-1 && grid[r][c+1] == 1 {
|
|
// res = append(res, point{r, c + 1})
|
|
// }
|
|
// return res
|
|
// }
|
|
|
|
// func orangesRotting(grid [][]int) int {
|
|
// m := len(grid)
|
|
// n := len(grid[0])
|
|
|
|
// queue := []point{}
|
|
// minutes := 0
|
|
// for row := range m {
|
|
// for col := range n {
|
|
// if grid[row][col] == 2 {
|
|
// queue = append(queue, point{row, col})
|
|
// minutes = -1
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// for len(queue) > 0 {
|
|
// batch := []point{}
|
|
// for len(queue) > 0 {
|
|
// cur := queue[0]
|
|
// queue = queue[1:]
|
|
// freshOranges := getFreshOrangesAround(grid, cur)
|
|
// for _, p := range freshOranges {
|
|
// grid[p.Row][p.Col] = 2
|
|
// }
|
|
// batch = append(batch, freshOranges...)
|
|
// }
|
|
// minutes++
|
|
// queue = batch
|
|
// }
|
|
|
|
// for row := range m {
|
|
// for col := range n {
|
|
// if grid[row][col] == 1 {
|
|
// return -1
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// return minutes
|
|
// }
|
|
|
|
func orangesRotting(grid [][]int) int {
|
|
m, n := len(grid), len(grid[0])
|
|
queue := []point{}
|
|
fresh := 0
|
|
for r := range m {
|
|
for c := range n {
|
|
switch grid[r][c] {
|
|
case 2:
|
|
queue = append(queue, point{r, c})
|
|
case 1:
|
|
fresh++
|
|
}
|
|
}
|
|
}
|
|
if fresh == 0 {
|
|
return 0
|
|
}
|
|
minutes := -1
|
|
dirs := []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
|
|
for len(queue) > 0 {
|
|
size := len(queue)
|
|
for range size {
|
|
cur := queue[0]
|
|
queue = queue[1:]
|
|
for _, d := range dirs {
|
|
nr, nc := cur.Row+d.Row, cur.Col+d.Col
|
|
if nr >= 0 && nr < m && nc >= 0 && nc < n && grid[nr][nc] == 1 {
|
|
grid[nr][nc] = 2
|
|
fresh--
|
|
queue = append(queue, point{nr, nc})
|
|
}
|
|
}
|
|
}
|
|
minutes++
|
|
}
|
|
if fresh > 0 {
|
|
return -1
|
|
}
|
|
return minutes
|
|
}
|
|
|
|
func Test1(t *testing.T) {
|
|
input := [][]int{{2, 1, 1}, {1, 1, 0}, {0, 1, 1}}
|
|
fmt.Println(orangesRotting(input))
|
|
}
|
|
|
|
func Test2(t *testing.T) {
|
|
input := [][]int{{2, 1, 1}, {0, 1, 1}, {1, 0, 1}}
|
|
fmt.Println(orangesRotting(input))
|
|
}
|
|
|
|
func Test3(t *testing.T) {
|
|
input := [][]int{{0, 2}}
|
|
fmt.Println(orangesRotting(input))
|
|
}
|