@@ -9,21 +9,37 @@ case class Point(x: Int, y: Int) {
9
9
copy(y = y - 1 ),
10
10
copy(y = y + 1 )
11
11
)
12
+
12
13
def manhattanDistance (to : Point ): Int = (x - to.x).abs + (y - to.y).abs
13
14
}
14
15
15
16
val risk : Map [Point , Int ] = input.zipWithIndex.flatMap { case (row, y) =>
16
17
row.zipWithIndex.map { case (risk, x) => Point (x, y) -> risk.toString.toInt }
17
18
}.toMap
18
19
19
- val start = Point (0 , 0 )
20
- val end = Point (input.head.length - 1 , input.length - 1 )
21
-
22
- class ChitonGrid () extends Grid [Point ] {
20
+ class ChitonGrid extends Grid [Point ] {
23
21
override def heuristicDistance (from : Point , to : Point ) = from.manhattanDistance(to)
24
- override def getNeighbours (state : Point ) = state.neighbors.filter(risk.keySet.contains)
22
+
23
+ override def getNeighbours (state : Point ) = state.neighbors.filter(risk.keySet)
24
+
25
25
override def moveCost (from : Point , to : Point ) = risk(to)
26
26
}
27
27
28
- aStarSearch(start, end, new ChitonGrid ())
28
+ val part1 = aStarSearch(Point (0 , 0 ), Point (input.head.length - 1 , input.length - 1 ), new ChitonGrid )
29
+
30
+ val width = input.head.length
31
+ val height = input.length
32
+ val riskPart2 : Map [Point , Int ] = (for (x <- input.head.indices;
33
+ y <- input.indices;
34
+ gridX <- 0 until 5 ;
35
+ gridY <- 0 until 5 ) yield
36
+ Point (x + gridX * width, y + gridY * width) -> ((risk(Point (x, y)) + gridX + gridY - 1 ) % 9 + 1 )
37
+ ).toMap
38
+
39
+ class ExtendedChitonGrid extends ChitonGrid {
40
+ override def getNeighbours (state : Point ) = state.neighbors.filter(riskPart2.keySet)
41
+
42
+ override def moveCost (from : Point , to : Point ) = riskPart2(to)
43
+ }
29
44
45
+ val part2 = aStarSearch(Point (0 , 0 ), Point (width * 5 - 1 , height * 5 - 1 ), new ExtendedChitonGrid )
0 commit comments