Day23
This commit is contained in:
parent
6f91c0b535
commit
2e59d1bdc0
|
@ -9,7 +9,6 @@ import (
|
||||||
type board struct {
|
type board struct {
|
||||||
corridor [11]rune
|
corridor [11]rune
|
||||||
rooms [4][4]rune
|
rooms [4][4]rune
|
||||||
energy int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var costs = map[rune]int{
|
var costs = map[rune]int{
|
||||||
|
@ -31,21 +30,18 @@ var enterableCorridorPos = [7]int{0, 1, 3, 5, 7, 9, 10}
|
||||||
func main() {
|
func main() {
|
||||||
playBoard := board{
|
playBoard := board{
|
||||||
[11]rune{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
|
[11]rune{'.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'},
|
||||||
[4][4]rune{{'D', 'D', 'D', 'B'}, {'D', 'C', 'B', 'A'}, {'C', 'B', 'A', 'A'}, {'B', 'A', 'C', 'C'}}, 0}
|
[4][4]rune{{'D', 'D', 'D', 'B'}, {'D', 'C', 'B', 'A'}, {'C', 'B', 'A', 'A'}, {'B', 'A', 'C', 'C'}}}
|
||||||
currentBoards := []board{}
|
currentBoards := make(map[board]int)
|
||||||
endBoards := []board{}
|
endBoards := make(map[board]int)
|
||||||
currentBoards = append(currentBoards, playBoard)
|
currentBoards[playBoard] = 0
|
||||||
for len(currentBoards) > 0 {
|
for len(currentBoards) > 0 {
|
||||||
step(¤tBoards, &endBoards)
|
step(¤tBoards, &endBoards)
|
||||||
fmt.Println(len(currentBoards))
|
|
||||||
fmt.Println(len(endBoards))
|
|
||||||
}
|
}
|
||||||
fmt.Println(len(endBoards))
|
|
||||||
minEnergy := 9999999
|
minEnergy := 9999999
|
||||||
for _, endBoard := range endBoards {
|
for endBoard, energy := range endBoards {
|
||||||
if checkWinner(endBoard) && endBoard.energy < minEnergy {
|
if checkWinner(endBoard) && energy < minEnergy {
|
||||||
if minEnergy > endBoard.energy {
|
if minEnergy > energy {
|
||||||
minEnergy = endBoard.energy
|
minEnergy = energy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,25 +59,28 @@ func checkWinner(board board) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func step(currentBoards *[]board, endBoards *[]board) {
|
func step(currentBoards *map[board]int, endBoards *map[board]int) {
|
||||||
var newBoards []board
|
for selectedBoard, selectedEnergy := range *currentBoards {
|
||||||
for _, selectedBoard := range *currentBoards {
|
delete(*currentBoards, selectedBoard)
|
||||||
possibleMoves := getPossibleMoves(selectedBoard)
|
possibleMoves := getPossibleMoves(selectedBoard)
|
||||||
if len(possibleMoves) == 0 {
|
if len(possibleMoves) == 0 {
|
||||||
*endBoards = append(*endBoards, selectedBoard)
|
if (*endBoards)[selectedBoard] == 0 || selectedEnergy < (*endBoards)[selectedBoard] {
|
||||||
|
(*endBoards)[selectedBoard] = selectedEnergy
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for start, targets := range possibleMoves {
|
for start, targets := range possibleMoves {
|
||||||
for _, target := range targets {
|
for _, target := range targets {
|
||||||
tmpNewBoard := useMove(selectedBoard, [2][2]int{start, target})
|
tmpNewBoard, tmpNewErnergy := useMove(selectedBoard, [2][2]int{start, target}, selectedEnergy)
|
||||||
newBoards = append(newBoards, tmpNewBoard)
|
if (*currentBoards)[tmpNewBoard] == 0 || tmpNewErnergy < (*currentBoards)[tmpNewBoard] {
|
||||||
|
(*currentBoards)[tmpNewBoard] = tmpNewErnergy
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*currentBoards = newBoards
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func useMove(board board, move [2][2]int) board {
|
func useMove(board board, move [2][2]int, energy int) (board, int) {
|
||||||
//Remove moved Amphoid
|
//Remove moved Amphoid
|
||||||
var amphoidType rune
|
var amphoidType rune
|
||||||
if move[0][0] == 0 {
|
if move[0][0] == 0 {
|
||||||
|
@ -102,14 +101,14 @@ func useMove(board board, move [2][2]int) board {
|
||||||
//Calculate cost
|
//Calculate cost
|
||||||
traveledDistance := 0
|
traveledDistance := 0
|
||||||
if move[0][0] == 0 {
|
if move[0][0] == 0 {
|
||||||
traveledDistance += Abs(move[0][1] - (move[1][0]*2 + 2))
|
traveledDistance += Abs(move[0][1] - ((move[1][0]-1)*2 + 2))
|
||||||
traveledDistance += move[1][1] + 1
|
traveledDistance += move[1][1] + 1
|
||||||
} else {
|
} else {
|
||||||
traveledDistance += Abs(move[1][1] - (move[0][0]*2 + 2))
|
traveledDistance += Abs(move[1][1] - ((move[0][0]-1)*2 + 2))
|
||||||
traveledDistance += move[0][1] + 1
|
traveledDistance += move[0][1] + 1
|
||||||
}
|
}
|
||||||
board.energy += costs[amphoidType] * (traveledDistance)
|
energy += costs[amphoidType] * (traveledDistance)
|
||||||
return board
|
return board, energy
|
||||||
}
|
}
|
||||||
|
|
||||||
func getPossibleMoves(board board) map[[2]int][][2]int {
|
func getPossibleMoves(board board) map[[2]int][][2]int {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user