go: add «959. Regions Cut By Slashes»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
e65bafabca
commit
e8bb5d909a
1 changed files with 83 additions and 0 deletions
83
go/regions-cut-by-slashes.go
Normal file
83
go/regions-cut-by-slashes.go
Normal file
|
@ -0,0 +1,83 @@
|
|||
package main
|
||||
|
||||
import aq "github.com/emirpasic/gods/v2/queues/arrayqueue"
|
||||
|
||||
type Position struct {
|
||||
y, x int
|
||||
}
|
||||
|
||||
const (
|
||||
WALL int = -1
|
||||
BLANK int = 0
|
||||
SEEN int = 1
|
||||
)
|
||||
|
||||
func regionsBySlashes(grid []string) int {
|
||||
POSITIONS := []Position{
|
||||
Position{0, 1},
|
||||
Position{0, -1},
|
||||
Position{1, 0},
|
||||
Position{-1, 0},
|
||||
}
|
||||
|
||||
n := len(grid)
|
||||
|
||||
makeGraph := func() [][]int {
|
||||
graph := make([][]int, 3*n)
|
||||
for i := range graph {
|
||||
graph[i] = make([]int, 3*n)
|
||||
}
|
||||
|
||||
for y0, row := range grid {
|
||||
for x0, cell := range row {
|
||||
y, x := 3*y0, 3*x0
|
||||
|
||||
if cell == '/' {
|
||||
graph[y][x+2] = WALL
|
||||
graph[y+1][x+1] = WALL
|
||||
graph[y+2][x] = WALL
|
||||
} else if cell == '\\' {
|
||||
graph[y][x] = WALL
|
||||
graph[y+1][x+1] = WALL
|
||||
graph[y+2][x+2] = WALL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return graph
|
||||
}
|
||||
|
||||
visit := func(g [][]int, p Position) bool {
|
||||
return p.y >= 0 && p.y < len(g) && p.x >= 0 && p.x < len(g[p.y]) && g[p.y][p.x] == BLANK
|
||||
}
|
||||
|
||||
fill := func(g [][]int, y, x int) {
|
||||
q := aq.New[Position]()
|
||||
q.Enqueue(Position{y, x})
|
||||
|
||||
for p, ok := q.Dequeue(); ok; p, ok = q.Dequeue() {
|
||||
for _, d := range POSITIONS {
|
||||
next := Position{p.y + d.y, p.x + d.x}
|
||||
|
||||
if visit(g, next) {
|
||||
q.Enqueue(next)
|
||||
g[next.y][next.x] = SEEN
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
graph := makeGraph()
|
||||
|
||||
regions := 0
|
||||
for p := 0; p < 9*n*n; p++ {
|
||||
y, x := p/(3*n), p%(3*n)
|
||||
|
||||
if graph[y][x] == BLANK {
|
||||
fill(graph, y, x)
|
||||
regions++
|
||||
}
|
||||
}
|
||||
|
||||
return regions
|
||||
}
|
Loading…
Reference in a new issue