go: add «994. Rotting Oranges»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
c7165f1c98
commit
520d14ee11
1 changed files with 79 additions and 0 deletions
79
go/rotting-oranges.go
Normal file
79
go/rotting-oranges.go
Normal file
|
@ -0,0 +1,79 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
aq "github.com/emirpasic/gods/v2/queues/arrayqueue"
|
||||
)
|
||||
|
||||
const (
|
||||
EMPTY_CELL int = 0
|
||||
FRESH_ORANGE int = 1
|
||||
ROTTEN_ORANGE int = 2
|
||||
)
|
||||
|
||||
type BFSEntry struct {
|
||||
time int
|
||||
y, x int
|
||||
}
|
||||
|
||||
func orangesRotting(grid [][]int) int {
|
||||
DIRECTIONS := [][]int{
|
||||
[]int{0, 1},
|
||||
[]int{0, -1},
|
||||
[]int{1, 0},
|
||||
[]int{-1, 0},
|
||||
}
|
||||
|
||||
inBounds := func(y, x int) bool {
|
||||
return y >= 0 && y < len(grid) && x >= 0 && x < len(grid[y])
|
||||
}
|
||||
countFresh := func() int {
|
||||
fresh := 0
|
||||
|
||||
for _, row := range grid {
|
||||
for _, orange := range row {
|
||||
if orange == FRESH_ORANGE {
|
||||
fresh++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fresh
|
||||
}
|
||||
initializeQueue := func(q *aq.Queue[BFSEntry]) {
|
||||
for y, row := range grid {
|
||||
for x, orange := range row {
|
||||
if orange != ROTTEN_ORANGE {
|
||||
continue
|
||||
}
|
||||
|
||||
q.Enqueue(BFSEntry{time: 0, y: y, x: x})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
q := aq.New[BFSEntry]()
|
||||
initializeQueue(q)
|
||||
|
||||
fresh, time := countFresh(), 0
|
||||
for !q.Empty() && fresh > 0 {
|
||||
value, _ := q.Dequeue()
|
||||
|
||||
for _, d := range DIRECTIONS {
|
||||
ny, nx := value.y+d[0], value.x+d[1]
|
||||
if !inBounds(ny, nx) || grid[ny][nx] != FRESH_ORANGE {
|
||||
continue
|
||||
}
|
||||
|
||||
grid[ny][nx] = ROTTEN_ORANGE
|
||||
fresh--
|
||||
q.Enqueue(BFSEntry{time: value.time + 1, y: ny, x: nx})
|
||||
time = value.time + 1
|
||||
}
|
||||
}
|
||||
|
||||
if fresh > 0 {
|
||||
return -1
|
||||
}
|
||||
|
||||
return time
|
||||
}
|
Loading…
Reference in a new issue