faecher:informatik:oberstufe:java:aoc:aoc2024:day20:start

Day 20: Race Condition

Das Rätsel lässt sich recht einfach z. B. mit einer Tiefensuche lösen. Da es nur genau einen möglichen Pfad gibt, benötigt man keinen komplizierten Algorithmus wie etwa Dijkstra - es gibt nur genau einen kürzesten Weg.

Vorgehensweise:

  • Speichere den Input in einem zweidimensionalen int[][] Array! Setze jede Pfad-Koordinate auf Integer.MAX_VALUE (ebenso die Start- und Zielkoordinate) und jede Wand ('#') auf -1. Merke dir außerdem in Variablen die Koordinaten vom Start und Ziel.
  • Führe eine Tiefensuche durch, um vom Start zum Ziel zu gelangen. Nutze dazu einen von dir verwalteten Stack und lege den Startknoten auf den Stack. Dazu bietet es sich an, eine separate Klasse zu besitzen, um sowohl die nächste zu betrachtende Koordinate als auch deren Distanz ("aktuelleDistanz") auf den Stack legen zu können. Für jede Koordinate, die man dann vom Stack entnimmt (while(stackIstNichtLeer) {…}), macht man folgendes:
    • Wenn an der Koordinate der Wert -1 ist (eine Wand), dann überspringe diese Koordinate mit continue;;
    • Wenn der Wert an der Koordinate > -1 ist (keine Wand), aber gleichzeitig < aktuelleDistanz, dann hat man sich offenbar beim vorherigen "Abbiegen" rückwärts bewegt → ebenfalls mit continue; überpringen.
    • Wenn der Wert an der Koordinate auf Integer.MAX_VALUE liegt, dann kann er durch die aktuelle Distanz ersetzt werden.
    • Wenn das Ende erreicht wurde (Koordinaten überprüfen), dann kann man die while-Schleife mit break; abbrechen.
    • Zum Abschluss folgt noch die "Rekursion" in alle 4 möglichen Richtungen: Man legt die vier benachbarten Koordinaten auf den Stack.

Lösungsvorschlag "separate Knotenklasse"

Lösungsvorschlag Teil 1:

Der Beginn ist absolut unverändert. Man berechnet genauso einmal den Weg bis zum Ziel. Es gibt bloß folgende Änderungen:

  • Alle Koordinaten, die Teil des Pfades vom Start zum Ziel sind, werden in einer ArrayList gespeichert.
  • Alle darin gespeicherten Koordinaten werden anschließend päärchenweise betrachtet (jede päärchenweise Kombination!).
    • Wenn beide Koordinaten nahe genug beieinander liegen (<20 picoseconds), wenn also überhaupt ein Cheat möglich wäre…
    • UND wenn die Pfad-Distanz an beiden Koordinaten größer ist als 100 (also wenn die Abkürzung überhaupt eine Relevanz hat / "gut genug ist"), wobei dazu noch die Distanz der x- und y-Koordinaten kommt, da der Cheat-Weg auch noch zurückgelegt werden muss…
    • DANN hat man einen weiteren Cheat gefunden.

Lösungsvorschlag

  • faecher/informatik/oberstufe/java/aoc/aoc2024/day20/start.txt
  • Zuletzt geändert: 20.12.2024 12:02
  • von Marco Kuemmel