Day 6: Guard Gallivant
Tag 6 ist eine klassische Aufgabe, die man gut in einem zweidimensionalen Array lösen kann. Besonders Teil 1 ließe sich theoretisch auch ohne einem Array lösen, indem man nur die Koordinaten der Hindernisse miteinander vergleicht/verrechnet und sich so von Hindernis zu Hindernis hangelt. Mit dem Array geht es aber intuitiver.
Teil 1
Vorgehensweise:
- Übertrage die Eingabedatei in ein zweidimensionales char-Array. Merke dir dabei, an welcher Koordinate der Guard losläuft.
- Erschaffe eine Richtungs-Variable vom Typ int. Wenn der Guard anschließend beim Marschieren auf ein Hinderniss trifft und abbieben muss, dann kannst du die int-Zahl immer um eins erhöhen, was einer neuen Richtung entspricht. Da es nur 4 Richtungen gibt, muss die Zahl nach dem Erhöhen u. U. automatisch auf 0 gesetzt werden, sodass die Werte 0, 1, 2 und 3 als Richtung zulässig sind (Tipp: Modulo).
- Beginne anschließend eine Endlosschleife (
while(true){…}
), um den Guard so lange laufen zu lassen, bis er aus der Map herausläuft. Anders darf die Schleife nicht abgebrochen werden.- Speichere, auf welche neue Koordinate der Guard als nächstes geradeaus laufen würde. Hier müssen für die 4 Richtungen 4 Fälle beachtet werden.
- Würde der Guard nun in dieser neuen Koordinate in einem Hindernis stehen, so bewegt er sich nicht auf die neue Koordinate, sondern ändert hingegen seine Richtung-Variable.
- Ansonsten aktualisiert man die aktuelle Position vom Guard und markiert außerdem die Position auf der Map (z. B. mit char 's' für step). In diesem Moment darf man auch die Anzahl der zurückgelegten Schritte um 1 erhöhen - allerdings nur dann, wenn die Position nicht bereits zuvor mit einem 's' markiert war.
- Am Ende der Endlosschleife muss man noch prüfen, ob sich der Guard nun direkt am Rand der Map befindet - nur genau dann kann man die Endlosschleife mit
break;
abbrechen.
Teil 2
Teil 2 macht manches insofern etwas schwerer, als dass man sich nun zum Einen merken muss, an welcher Stelle man bereits in welcher Richtung entlang gelaufen ist um Loops zu erkennen. Zum Anderen muss man in einer weiteren Schleife das Hindernis jedes Mal an eine neue Stelle setzen und gleichzeitig die vorherigen Markierungen löschen bzw. eine Startvorlage der Karte kopieren.