faecher:informatik:oberstufe:java:aoc:aco2023:day16:start

Tag 16 - The Floor Will Be Lava

  • Interpretiere die Eingabedaten als char[][]-Array
  • Lege zudem noch ein String[][]-Array an. In dieses kannst du pro Koordinate alle Richtungen speichern, mit denen du dich bereits über die Koordinate bewegt hast. Bsp. aktuell ist an der Koordinate "u" für upwards gespeichert. Jetzt betrittst du die Koordinate ein zweites Mal in Richtung downwards, also fügst du ein "d" an den String an → "ud". Später betrittst du die Koordinate erneut in Richtung downwards (du hast wahrscheinlich einen Loop und kannst in jedem Fall abbrechen!). Um den Abbruch zu erkennen, überprüfst du daher immer direkt zu Beginn jedes Schritts ob der Buchstabe der Richtung (hier "d" bereits in dem String der Koordinate vorhanden ist.
  • Gehe Schritt für Schritt über das char[][]-Array entlang des Lichtstrahls. Nutze dafür eine rekursive Methode, z. B. nextBeam(). Rekursion ist nötig, da der Lichtstrahl an zwei möglichen Zeichen aufgesplittet werden kann. Das lässt sich mit einer einfachen Schleife nicht lösen. Wie funktioniert die Methode?
    • Die Methode benötigt nur drei Parameter (x- und y-Koordinate und die Richtung, in die der Lichtstrahl läuft (als char)).
    • Erzeuge in der Methode eine Endlosschleife mit while(true) {…}. Das tun wir, um immer alle Schritte in derselben Rekursiontiefe innerhalb der Schleife ausführen zu können bis eine Aufsplittung des Lichtstrahls kommt. Andernfalls kommt es zu einem Stack-Overflow, wenn man jeden Schritt direkt rekursiv ausführen würde.
    • Prüfe, ob die Koordinaten erlaubt sind (innerhalb des Spielfelds liegen) und ob man die Koordinate bereits in derselben Richtung betreten hat (siehe oberen Punkt). Bei Abbruch: return um die Endlosschleife abzubrechen.
    • Vermerke den Besuch mit der Richtung auf der Koordinate (siehe oberen Punkt).
    • Abschließend beginnen umfassende Verzweigungen. Im Lösungsvorschlag habe ich heute ausnahmsweise mal switch-case genutzt, anstatt if-else. Damit kann es etwas übersichtlicher werden. Man muss allerdings mit den break-Befehlen aufpassen!
    • Wenn der Lichtstrahl sich nicht aufsplittet, dann wird nur die Koordinate und falls nötig die Richtung angepasst, anschließend soll die Endlosschleife wieder von vorne beginnen.
    • Wenn der Lichtstrahl sich aufsplittet, dann müssen die zwei nächsten möglichen Wege rekursiv aufgerufen werden. Anschließend muss mit return die Endlosschleife abgeschlossen werden.

Lösungsvorschlag Teil 1

Für Teil 2 müssen nur wenige Änderungen vorgenommen werden. In der Haupt-Methode müssen in 4 Schleifen der Reihe nach alle Möglichkeiten durchprobiert werden. Nach jedem Durchgang muss geprüft werden, ob damit das neue Maximum gefunden wurde. Wichtig: das String[][]-Array muss unbedingt jedes Mal zurückgesetzt werden.

Lösungsvorschlag Teil 2

  • faecher/informatik/oberstufe/java/aoc/aco2023/day16/start.txt
  • Zuletzt geändert: 16.12.2023 18:40
  • von Marco Kuemmel