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 {
4343 val forwardSearch = forwardGraphSearch(grid)
4444 val forwardResult = Dijkstra .search(forwardSearch)
4545
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)
4848
4949 override def unitNeighbors (reindeer : Reindeer ): IterableOnce [Reindeer ] = {
5050 val distance = forwardResult.distances(reindeer)
Original file line number Diff line number Diff line change @@ -7,15 +7,15 @@ object BFS {
77 // TODO: reduce duplication without impacting performance
88
99 // 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 ] = {
1111 val visitedDistance : mutable.Map [A , Int ] = mutable.Map .empty
1212 val toVisit : mutable.Queue [(Int , A )] = mutable.Queue .empty
1313
1414 def enqueue (node : A , dist : Int ): Unit = {
1515 toVisit.enqueue((dist, node))
1616 }
1717
18- enqueue( graphTraversal.startNode , 0 )
18+ graphTraversal.startNodes.iterator.foreach(enqueue(_ , 0 ) )
1919
2020 while (toVisit.nonEmpty) {
2121 val (dist, node) = toVisit.dequeue()
Original file line number Diff line number Diff line change 11package eu .sim642 .adventofcodelib .graph
22
3- trait GraphSearch [A ] extends GraphTraversal [A ] {
3+ trait GraphSearch0 [A ] extends GraphTraversal0 [A ] {
44 // def isTargetNode(node: A): Boolean
55 def isTargetNode (node : A , dist : Int ): Boolean // TODO: does dist-based target make sense for A*?
66}
77
8+ trait GraphSearch [A ] extends GraphTraversal [A ], GraphSearch0 [A ]
9+
810trait TargetNode [A ] { this : GraphSearch [A ] =>
911 val targetNode : A
1012
Original file line number Diff line number Diff line change @@ -2,12 +2,20 @@ package eu.sim642.adventofcodelib.graph
22
33import eu .sim642 .adventofcodelib .LazyListImplicits ._
44
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 ] {
611 val startNode : A
12+
13+ override def startNodes : IterableOnce [A ] = Iterator .single(startNode)
14+
715 def neighbors (node : A ): IterableOnce [(A , Int )]
816}
917
10- trait UnitNeighbors [A ] { this : GraphTraversal [A ] =>
18+ trait UnitNeighbors [A ] { this : GraphTraversal0 [A ] =>
1119 def unitNeighbors (node : A ): IterableOnce [A ]
1220
1321 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