Table of Contents

Aufgabe 1

In dieser Aufgabe geht es darum, das Spielfeld zufällig in zusammenhänge Regionen der Grösse 4 bis 8 aufzuteilen.

Das soll die Methode randomRegions in der Datei model.js erledigen.

Navigieren Sie in das Verzeichnis funkmast und «checken» Sie den «tag» a1 aus:

git fetch --all --tags
git checkout tags/a1
git switch -c dev

Theorie

Im Cell-Tower Spiel betrachten wir den Graphen $G$, dessen Knoten den Buchstabenfeldern entsprechen, die durch eine Kante verbunden sind, wenn die Felder direkt benachbart sind. Ein Knoten hat also meistens vier Nachbarn.

Algorithmus zur Generierung von zufälligen Regionen

Dieser Algorithmus funktioniert nicht immer. Es gibt Bäume, die nicht aufteilbar sind. Als extremes Beispiel sei ein Stern (zentraler Knoten, alle anderen sind damit verbunden). So ein Baum kann nur in einen einzelnen Knoten und den Rest getrennt werden.

Algorithmus zur Generierung eines zufälligen Baums

Während der Ausführung haben alle durch Pfade verbundenen Knoten die gleichen Labels. Verbunden werden so nur Teile, die noch nicht verbunden waren. Das garantiert, dass keine Kreise entstehen. Am Schluss entsteht so ein Baum.

Zählen der Anzahl Knoten in einem Baum

Aufgerufen wird die Funktion mit zählen($v$, null), wobei $v$ irgendein Knoten vom Baum ist.

Diese Funktion ist korrekt, weil ein Baum keine Kreise enthält. Ansonsten müsste man die Knoten markieren um zu verhindern, dass zwei mal der gleiche Knoten besucht wird.

Datenstrukturen für Graphen

Ein Graph kann auf verschiedene Arten gespeichert werden, die je nach nötigen Manipulationen und abfragen effizient sind oder nicht.

Die Knoten werden meist einfach mit den Zahlen $0$ bis $n-1$ dargestellt. Daten, die den Knoten zugeordnet sind, werden in Arrays gespeichert, die über diesen Index angesprochen werden.

Für die Kanten gibt es mehrere Möglichkeiten:

Variante Hamiltonischer Pfad

Das Problem mit nicht-aufteilbaren Bäumen kann umgangen werden, wenn mit einem hamiltonischen Pfad (einer der alle Knoten genau einmal besucht) gestartet wird. Ein (genügend) zufälliger solcher Pfad kann z.B. mit folgendem Algorithmus generiert werden: https://stackoverflow.com/questions/7371227/algorithm-to-find-a-random-hamiltonian-path-in-a-grid

Wie gleichverteilt zufällig aus allen möglichen Aufteilungen in Regionen eine generiert werden kann, erschliesst sich mir noch nicht.