Das magische Quadrat ist ein mathematisches Rätsel. Gegeben ist ein Quadrat der Seitenlänge n. Die Aufgabe besteht darin, die Zahlen 1 bis $n^2$ so zu verteilen, dass die Summe der Zahlen jeder Zeile, jeder Spalte und der beiden großen Diagonalen identisch ist. Diese Summe wird auch als magische Zahl bezeichnet.
Da die Verteilung der Zahlen bei gegebener Seitenlänge immer feststeht, ist auch immer die magische Zahl berechenbar. Es gilt, dass die magische Zahl $1 / n$ mal der Summe der Zahlen von 1 bis $n^2$ sein muss:
\begin{eqnarray*} magischeZahl = \frac{1}{n} \sum^{n^2}_{k=1}k = \frac{n^3 + n}{2} \end{eqnarray*}
Lies hier erst weiter, nachdem du dir selbst Gedanken gemacht hast, wie du vorgehen könntest.
Die Vorgehensweise ist letztlich sehr ähnlich zum 8-Damen-Problem. Auch hier versuchen wir systematisch das nächste Feld zu besetzen. Unterschiede sind im Detail:
Aus dieser Überlegung ergibt sich der folgende Pseudocode:
fuelleFeld(f): wenn f < n*n: für jede Zahl i = 1 bis n*n: wenn i noch nicht genutzt wurde: markiere i als genutzt platziere i im quadrat im feld f wenn das Quadrat fehlerfrei ist: fuelleFeld(f+1) entferne i aus dem quadrat aus feld f markiere i als ungenutzt sonst: druckeQuadrat()
Gestartet wird der Code mit dem Aufruf fuelleFeld(0)
Hinweise:
f
gibt an, das wievielte Feld des Quadrats gefüllt werden soll. Dabei wird links oben begonnen zu zählen (mit 0) und reihenweise vorgegangen. Bei einem 3x3 Quadrat sieht die Nummerierung also wie folgt aus:0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
quadrat[f / n][f % n] = i
quadratFehlerfrei()
ist bereits vorhanden und darf genutzt werden. Sie überprüft, ob es in einer Reihe, Spalte oder Diagonalen zu einem Fehler kommt. Bei einer enthaltenen 0 wird diese Reihe/Spalte/Diagonale nicht als fehlerhaft gewertet.druckeQuadrat()
ist bereits implementiert und darf genutzt werden.