This commit is contained in:
Karl Spickermann 2021-12-24 14:09:03 +01:00
parent 6f91c0b535
commit 2e59d1bdc0

View File

@ -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(&currentBoards, &endBoards) step(&currentBoards, &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 {