Skip to content

Commit fcd5795

Browse files
committed
Try BFS with multiple start nodes
1 parent ad4578f commit fcd5795

File tree

4 files changed

+17
-7
lines changed

4 files changed

+17
-7
lines changed

src/main/scala/eu/sim642/adventofcode2024/Day16.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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)

src/main/scala/eu/sim642/adventofcodelib/graph/BFS.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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()

src/main/scala/eu/sim642/adventofcodelib/graph/GraphSearch.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package 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+
810
trait TargetNode[A] { this: GraphSearch[A] =>
911
val targetNode: A
1012

src/main/scala/eu/sim642/adventofcodelib/graph/GraphTraversal.scala

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,20 @@ package eu.sim642.adventofcodelib.graph
22

33
import 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)

0 commit comments

Comments
 (0)