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)) }