File tree Expand file tree Collapse file tree 4 files changed +17
-7
lines changed Expand file tree Collapse file tree 4 files changed +17
-7
lines changed Original file line number Diff line number Diff line change @@ -43,8 +43,8 @@ object Day16 {
43
43
val forwardSearch = forwardGraphSearch(grid)
44
44
val forwardResult = Dijkstra .search(forwardSearch)
45
45
46
- val backwardTraversal = new GraphTraversal [Reindeer ] with UnitNeighbors [Reindeer ] {
47
- override val startNode : Reindeer = forwardResult.target.get._1 // TODO: other orientations
46
+ val backwardTraversal = new GraphTraversal0 [Reindeer ] with UnitNeighbors [Reindeer ] {
47
+ override def startNodes : IterableOnce [ Reindeer ] = Pos .axisOffsets.map(d => forwardResult.target.get._1.copy(direction = d)).filter(forwardResult.nodes.contains)
48
48
49
49
override def unitNeighbors (reindeer : Reindeer ): IterableOnce [Reindeer ] = {
50
50
val distance = forwardResult.distances(reindeer)
Original file line number Diff line number Diff line change @@ -7,15 +7,15 @@ object BFS {
7
7
// TODO: reduce duplication without impacting performance
8
8
9
9
// copied from Dijkstra
10
- def traverse [A ](graphTraversal : GraphTraversal [A ] & UnitNeighbors [A ]): Distances [A ] = {
10
+ def traverse [A ](graphTraversal : GraphTraversal0 [A ] & UnitNeighbors [A ]): Distances [A ] = {
11
11
val visitedDistance : mutable.Map [A , Int ] = mutable.Map .empty
12
12
val toVisit : mutable.Queue [(Int , A )] = mutable.Queue .empty
13
13
14
14
def enqueue (node : A , dist : Int ): Unit = {
15
15
toVisit.enqueue((dist, node))
16
16
}
17
17
18
- enqueue( graphTraversal.startNode , 0 )
18
+ graphTraversal.startNodes.iterator.foreach(enqueue(_ , 0 ) )
19
19
20
20
while (toVisit.nonEmpty) {
21
21
val (dist, node) = toVisit.dequeue()
Original file line number Diff line number Diff line change 1
1
package eu .sim642 .adventofcodelib .graph
2
2
3
- trait GraphSearch [A ] extends GraphTraversal [A ] {
3
+ trait GraphSearch0 [A ] extends GraphTraversal0 [A ] {
4
4
// def isTargetNode(node: A): Boolean
5
5
def isTargetNode (node : A , dist : Int ): Boolean // TODO: does dist-based target make sense for A*?
6
6
}
7
7
8
+ trait GraphSearch [A ] extends GraphTraversal [A ], GraphSearch0 [A ]
9
+
8
10
trait TargetNode [A ] { this : GraphSearch [A ] =>
9
11
val targetNode : A
10
12
Original file line number Diff line number Diff line change @@ -2,12 +2,20 @@ package eu.sim642.adventofcodelib.graph
2
2
3
3
import eu .sim642 .adventofcodelib .LazyListImplicits ._
4
4
5
- trait GraphTraversal [A ] {
5
+ trait GraphTraversal0 [A ] {
6
+ def startNodes : IterableOnce [A ] // TODO: should be val?
7
+ def neighbors (node : A ): IterableOnce [(A , Int )]
8
+ }
9
+
10
+ trait GraphTraversal [A ] extends GraphTraversal0 [A ] {
6
11
val startNode : A
12
+
13
+ override def startNodes : IterableOnce [A ] = Iterator .single(startNode)
14
+
7
15
def neighbors (node : A ): IterableOnce [(A , Int )]
8
16
}
9
17
10
- trait UnitNeighbors [A ] { this : GraphTraversal [A ] =>
18
+ trait UnitNeighbors [A ] { this : GraphTraversal0 [A ] =>
11
19
def unitNeighbors (node : A ): IterableOnce [A ]
12
20
13
21
override final def neighbors (node : A ): IterableOnce [(A , Int )] = unitNeighbors(node).iterator.map(_ -> 1 )
You can’t perform that action at this time.
0 commit comments