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

Day 12: Garden Groups

Teil 1 lässt sich noch verhältnismäßig gut lösen, wenn man die richtige Vorgehensweise mittels Rekursion erkennt. Für Teil 2 hingegen muss man sich noch zusätzlich einen Kniff überlegen.

Vorgehensweise:

  • Übertrage alle Werte in ein dreidimensionales char-Array. Die ersten beiden Dimensionen werden für die x- und y-Koordinate verwendet. Die letzte Dimension soll einen Speicherplatz für 2 Werte haben. An deren Index 0 wird der eigentliche char-Wert des Inputs gespeichert, am Index 1 hingegen eine '1', falls das zugehörige Buchstaben-Feld nocht nicht bearbeitet wurde (direkt zu Beginn) und später dann '0', falls es bereits bearbeitet wurde.
  • Gehe nun in einer verschachtelten Schleife über alle Koordinaten des Feldes. Wenn ein Feld noch nicht bearbeitet wurde (dritte Dimension, zweiter Index = '1'), dann gehts weiter:
    • Setze eine Instanz-(!)-Variable für area auf 0 und ebenso für perimeter.
    • Rufe anschließend eine Rekursionsmethode auf der aktuellen Koordinate auf, die sich in alle 4 Richtungen "ausbreitet" und so das ganze Areal des aktuellen chars erkunden soll.
    • Wenn die Rekursion schließlich vollständig abgeschlossen ist, dann sind die Instanzvariablen area und perimeter aktualisiert und du kannst den Preis aktualisieren. Anschließend geht es mit dem nächsten äußeren Schleifendurchlauf zur nächsten Koordinate die noch NICHT bearbeitet wurde.
  • Die Rekursion benötigt 3 Parameter:
    1. Der char, um den es geht
    2. Die x-Koordinate
    3. Die y-Koordinate
  • Die Rekursion kennt folgende Basisfälle:
    1. Die Koordinaten liegen außerhalb des Felds. Gleichzeitig bedeutet das auch, dass man sich beim Aufruf dieser Rekursion erst in das "Aus" bewegt hat. Man hat also einen Zaun / perimeter mehr gefunden!
    2. Die aktuelle Koordinate ist schon bearbeitet ('0')
    3. Die aktuelle Koordinate enthält nicht den gesuchten char
  • Sind die Basisfälle überwunden, dann hat man ein korrektes Feld gefunden, kann also die area um eins erhöhen und die aktuelle Koordinate auf "bearbeitet" ('0') setzen.
  • Anschließend muss man für alle 4 Richtungen prüfen, ob dort ein Feld mit einem anderen char liegt, dann muss perimeter um eins erhöht werden.
  • Zum Abschluss muss man die Rekursion auf allen 4 benachbarten Koordinaten fortsetzen.

Lösungsvorschlag

Grundidee: Wir verfahren ganz ähnlich wie in Teil 1, markieren aber im rekursiven Aufruf alle Felder einer Region als "gerade markiert" ('2'). Direkt nach der Rekursion gehen wir über das gesamte Feld und suchen an den Spalten und Zeilen die Grenzübergänge von den "gerade markierten" Feldern zu den Nachbarfeldern. (Eine ziemlich "unschöne", aber funktionale Lösung.)

Lösungsvorschlag

  • faecher/informatik/oberstufe/java/aoc/aoc2024/day12/start.txt
  • Zuletzt geändert: 12.12.2024 15:11
  • von Marco Kuemmel