|
@@ -8,8 +8,7 @@ import (
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
- Diff = 48
|
|
|
- MaxMoves = 3
|
|
|
+ Diff = 48
|
|
|
)
|
|
|
|
|
|
func readInput(file *os.File) [][]int {
|
|
@@ -51,14 +50,14 @@ type Destination struct {
|
|
|
direction int
|
|
|
}
|
|
|
|
|
|
-func getNorth(board [][]int, height int, width int, lava Destination) []Destination {
|
|
|
+func getNorth(board [][]int, height int, width int, lava Destination, minMoves int, maxMoves int) []Destination {
|
|
|
var destinations []Destination
|
|
|
moves := 0
|
|
|
if lava.direction == North {
|
|
|
moves = lava.moves
|
|
|
}
|
|
|
|
|
|
- end := lava.pos.y - MaxMoves
|
|
|
+ end := lava.pos.y - maxMoves
|
|
|
if end < 0 {
|
|
|
end = 0
|
|
|
}
|
|
@@ -67,24 +66,26 @@ func getNorth(board [][]int, height int, width int, lava Destination) []Destinat
|
|
|
for y := lava.pos.y - 1; y >= end; y-- {
|
|
|
cost += board[y][lava.pos.x]
|
|
|
moves++
|
|
|
- if moves > MaxMoves {
|
|
|
+ if moves > maxMoves {
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- destinations = append(destinations, Destination{pos: Point{y: y, x: lava.pos.x}, moves: moves, cost: cost, direction: North})
|
|
|
+ if moves > minMoves {
|
|
|
+ destinations = append(destinations, Destination{pos: Point{y: y, x: lava.pos.x}, moves: moves, cost: cost, direction: North})
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return destinations
|
|
|
}
|
|
|
|
|
|
-func getEast(board [][]int, height int, width int, lava Destination) []Destination {
|
|
|
+func getEast(board [][]int, height int, width int, lava Destination, minMoves int, maxMoves int) []Destination {
|
|
|
var destinations []Destination
|
|
|
moves := 0
|
|
|
if lava.direction == East {
|
|
|
moves = lava.moves
|
|
|
}
|
|
|
|
|
|
- end := lava.pos.x + MaxMoves
|
|
|
+ end := lava.pos.x + maxMoves
|
|
|
if end >= width {
|
|
|
end = width - 1
|
|
|
}
|
|
@@ -93,27 +94,26 @@ func getEast(board [][]int, height int, width int, lava Destination) []Destinati
|
|
|
for x := lava.pos.x + 1; x <= end; x++ {
|
|
|
cost += board[lava.pos.y][x]
|
|
|
moves++
|
|
|
- if moves > MaxMoves {
|
|
|
+ if moves > maxMoves {
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- destinations = append(destinations, Destination{pos: Point{y: lava.pos.y, x: x}, moves: moves, cost: cost, direction: East})
|
|
|
- if moves > MaxMoves {
|
|
|
- break
|
|
|
+ if moves > minMoves {
|
|
|
+ destinations = append(destinations, Destination{pos: Point{y: lava.pos.y, x: x}, moves: moves, cost: cost, direction: East})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return destinations
|
|
|
}
|
|
|
|
|
|
-func getSouth(board [][]int, height int, width int, lava Destination) []Destination {
|
|
|
+func getSouth(board [][]int, height int, width int, lava Destination, minMoves int, maxMoves int) []Destination {
|
|
|
var destinations []Destination
|
|
|
moves := 0
|
|
|
if lava.direction == South {
|
|
|
moves = lava.moves
|
|
|
}
|
|
|
|
|
|
- end := lava.pos.y + MaxMoves
|
|
|
+ end := lava.pos.y + maxMoves
|
|
|
if end >= height {
|
|
|
end = height - 1
|
|
|
}
|
|
@@ -122,24 +122,26 @@ func getSouth(board [][]int, height int, width int, lava Destination) []Destinat
|
|
|
for y := lava.pos.y + 1; y <= end; y++ {
|
|
|
cost += board[y][lava.pos.x]
|
|
|
moves++
|
|
|
- if moves > MaxMoves {
|
|
|
+ if moves > maxMoves {
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- destinations = append(destinations, Destination{pos: Point{y: y, x: lava.pos.x}, moves: moves, cost: cost, direction: South})
|
|
|
+ if moves > minMoves {
|
|
|
+ destinations = append(destinations, Destination{pos: Point{y: y, x: lava.pos.x}, moves: moves, cost: cost, direction: South})
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return destinations
|
|
|
}
|
|
|
|
|
|
-func getWest(board [][]int, height int, width int, lava Destination) []Destination {
|
|
|
+func getWest(board [][]int, height int, width int, lava Destination, minMoves int, maxMoves int) []Destination {
|
|
|
var destinations []Destination
|
|
|
moves := 0
|
|
|
if lava.direction == West {
|
|
|
moves = lava.moves
|
|
|
}
|
|
|
|
|
|
- end := lava.pos.x - MaxMoves
|
|
|
+ end := lava.pos.x - maxMoves
|
|
|
if end < 0 {
|
|
|
end = 0
|
|
|
}
|
|
@@ -148,11 +150,13 @@ func getWest(board [][]int, height int, width int, lava Destination) []Destinati
|
|
|
for x := lava.pos.x - 1; x >= end; x-- {
|
|
|
cost += board[lava.pos.y][x]
|
|
|
moves++
|
|
|
- if moves > MaxMoves {
|
|
|
+ if moves > maxMoves {
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- destinations = append(destinations, Destination{pos: Point{y: lava.pos.y, x: x}, moves: moves, cost: cost, direction: West})
|
|
|
+ if moves > minMoves {
|
|
|
+ destinations = append(destinations, Destination{pos: Point{y: lava.pos.y, x: x}, moves: moves, cost: cost, direction: West})
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return destinations
|
|
@@ -173,19 +177,19 @@ func getDirections(direction int) []int {
|
|
|
return []int{}
|
|
|
}
|
|
|
|
|
|
-func getDestinations(board [][]int, height int, width int, lava Destination) []Destination {
|
|
|
+func getDestinations(board [][]int, height int, width int, lava Destination, minMoves int, maxMoves int) []Destination {
|
|
|
var destinations []Destination
|
|
|
directions := getDirections(lava.direction)
|
|
|
for i := range directions {
|
|
|
switch directions[i] {
|
|
|
case North:
|
|
|
- destinations = append(destinations, getNorth(board, height, width, lava)...)
|
|
|
+ destinations = append(destinations, getNorth(board, height, width, lava, minMoves, maxMoves)...)
|
|
|
case East:
|
|
|
- destinations = append(destinations, getEast(board, height, width, lava)...)
|
|
|
+ destinations = append(destinations, getEast(board, height, width, lava, minMoves, maxMoves)...)
|
|
|
case South:
|
|
|
- destinations = append(destinations, getSouth(board, height, width, lava)...)
|
|
|
+ destinations = append(destinations, getSouth(board, height, width, lava, minMoves, maxMoves)...)
|
|
|
case West:
|
|
|
- destinations = append(destinations, getWest(board, height, width, lava)...)
|
|
|
+ destinations = append(destinations, getWest(board, height, width, lava, minMoves, maxMoves)...)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -197,7 +201,7 @@ type Visited struct {
|
|
|
direction int
|
|
|
}
|
|
|
|
|
|
-func part1(board [][]int) int {
|
|
|
+func calculate(board [][]int, minMoves int, maxMoves int) int {
|
|
|
min := 1000000
|
|
|
height := len(board)
|
|
|
width := len(board[0])
|
|
@@ -220,7 +224,7 @@ func part1(board [][]int) int {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- successors := getDestinations(board, height, width, current)
|
|
|
+ successors := getDestinations(board, height, width, current, minMoves, maxMoves)
|
|
|
for i := range successors {
|
|
|
v := Visited{pos: successors[i].pos, direction: successors[i].direction}
|
|
|
newCost := successors[i].cost
|
|
@@ -248,5 +252,6 @@ func main() {
|
|
|
}
|
|
|
|
|
|
board := readInput(file)
|
|
|
- fmt.Println("Part1:", part1(board))
|
|
|
+ fmt.Println("Part1:", calculate(board, 0, 3))
|
|
|
+ fmt.Println("Part2:", calculate(board, 3, 10))
|
|
|
}
|