adventofcode/2018/day15/map.go

50 lines
865 B
Go

package main
type Coordinate struct {
X, Y int
}
var offsets = []Coordinate{
{0, -1},
{-1, 0},
{1, 0},
{0, 1},
}
type Map map[int]map[int]*Tile
func (m Map) SetTile(t *Tile, x, y int) {
if m[y] == nil {
m[y] = make(map[int]*Tile)
}
m[y][x] = t
t.X = x
t.Y = y
t.Map = m
}
func (m Map) Tile(x, y int) *Tile {
if m[y] == nil {
return nil
}
return m[y][x]
}
func (m Map) FindWalkableTiles(t *Tile) (map[*Tile]int, map[*Tile]*Tile) {
frontier := []*Tile{t}
distance := map[*Tile]int{t: 0}
cameFrom := map[*Tile]*Tile{t: nil}
for len(frontier) > 0 {
current := frontier[0]
frontier = frontier[1:]
for _, next := range current.WalkableNeighbors() {
if _, ok := distance[next]; !ok {
frontier = append(frontier, next)
distance[next] = distance[current] + 1
cameFrom[next] = current
}
}
}
return distance, cameFrom
}