-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexpandislands.go
53 lines (48 loc) · 1.16 KB
/
expandislands.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
func init() {
Register(ExpandIslands, "expandIslands", "expand")
}
func ExpandIslands(state State) State {
state = state.Clone()
remainingLands := state.UndiscoveredIslands()
islandTiles := map[byte][]Pos{}
expansions := map[byte][]Pos{}
for y, row := range state.board {
for x, cell := range row {
if !cell.Land() || cell == SomeLand {
continue
}
islandTiles[cell.Char()] = append(islandTiles[cell.Char()], Pos{x, y})
}
}
for land, remaining := range remainingLands {
if remaining == 0 {
continue
}
bodies := GroupBodies(state, islandTiles[land])
bodyLoop:
for _, body := range bodies {
expansionOption := Pos{-1, -1}
for pos := range body {
for _, newPos := range state.Around(pos) {
if !state.Get(newPos).FullyKnown() {
if expansionOption.x != -1 {
// Two+ options. Can't decide yet.
continue bodyLoop
}
expansionOption = newPos
}
}
}
if expansionOption.x != -1 {
expansions[land] = append(expansions[land], expansionOption)
}
}
}
for land, positions := range expansions {
for _, pos := range positions {
state.Set(pos, Cell(land))
}
}
return state
}