package q994 func orangesRotting(grid [][]int) int { w, h := len(grid[0]), len(grid) queue := make([][3]int, 0, w+h) // row, col, minute nFresh, nRot := 0, 0 for r := range grid { for c := range grid[0] { switch grid[r][c] { case 1: nFresh++ case 2: nRot++ queue = append(queue, [3]int{r, c, 0}) } } } var rot = func(r, c, minute int) { if r < 0 || c < 0 || r >= h || c >= w || grid[r][c] != 1 { return } grid[r][c] = 2 nFresh-- nRot++ queue = append(queue, [3]int{r, c, minute}) } minutes := 0 for ; len(queue) > 0; queue = queue[1:] { cur := queue[0] r, c, minute := cur[0], cur[1], cur[2] minutes = max(minute, minutes) rot(r, c+1, minute+1) rot(r, c-1, minute+1) rot(r+1, c, minute+1) rot(r-1, c, minute+1) } if nFresh == 0 { return minutes } return -1 } var _ = orangesRotting