Sudoku-Löser
Das Logikrätsel Sudoku dürften den meisten Menschen ein Begriff sein. Es geht darum, die Zahlen 1-9 in einem 9x9 Feld unterzubringen. Bei der Anordnung der Zahlen gilt: Weder in einer Zeile, noch in einer Spalte, noch in einem 3x3 Feld darf zweimal dieselbe Zahl auftauchen.
Das erste der rechts zu sehenden Sudokus ist eine Vorlage, bei der bereits ein paar Zahlen vorgegeben sind. Das zweite Bild zeigt dann die dazugehörige Lösung. Alle roten Zahlen wurden auf Basis der vorgegebenen schwarzen Zahlen hinzugefügt.
Auch Sudokus lassen sich wunderbar mittels einfachem Backtracking durch Ausprobieren aller möglichen Kombinationen lösen. Tatsächlich gibt es bei Sudokus noch einige andere Möglichkeiten, eine Lösung auch deutlich "intelligenter" und zeitsparender zu finden. Grundsätzlich genügt aber das Backtracking.
Algorithmus
Vorüberlegungen:
- In der nachfolgend gegebenen Vorlage wird das Spielfeld in einem 81 Zeichen langen eindimensionalen int-Array namens
spielfeld
gespeichert. Das erleichtert wieder u. a. das rekursive Befüllen des nächsten Feldes. Man kann sich das Spielfeld bezüglich der Indizes also wie folgt vorstellen:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 |
54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 |
- Da es beim Sudoku in der Regel nur um das Finden einer einzigen Lösung geht, muss der rekursive Algorithmus aktiv abgebrochen werden. Ansonsten würde das Programm (wie bei den 8-Damen und den magischen Quadraten) immer noch weitere denkbare Lösungen suchen. Daher steht die boolean-Instanzvariable
loesungGefunden
zur Verfügung. - Beim Start des Sudoku-Lösers werden leere Zellen (bei denen kein Startwert vorgegeben war) als
0
imspielfeld
gespeichert. - Achtet darauf, dass ihr Felder, die bereits vorbelegt sind, nicht überschreibt!
(A1)
- Lade die Vorlage herunter und mache dich rudimentär mit der Funktionsweise des Programms / der GUI vertraut. Du musst den bereits vorgegebenen Code nicht nachvollziehen.
- Du kannst in der GUI einzelne Zahlen vorgeben und dann auf den Knopf "Lösen" klicken. Daraufhin wird die Methode
loeseSudoku(0)
aufgerufen. - Implementiere folgende Methoden:
loeseSudoku(int feld)
, welche die grundlegende rekursive Methode darstellt.istFehlerfrei()
, welche das komplette Sudoku-Feld auf Fehler überprüft.
Nachfolgend findest du Tipps in Form von Pseudocode sowie Lösungsvorschläge.
Tipp zur Methode istFehlerfrei()
:
Wenn du die Methode istFehlerfrei()
testen möchtest, dann bietet sich an, ein im Code vorliegendes int[] Array zu nutzen, das du direkt überprüfen kannst. Du kannst das Array z. B. wie folgt anlegen:
private int[] spielfeld = new int[]{ 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, 1,2,3,4,5,6,7,8,9, };
Die Zahlen kannst du editieren wie du sie magst (das 9x9 Format muss eingehalten werden) und anschließend die Methode istFehlerfrei()
aufrufen. Diese Methode muss dazu natürlich vorübergehend public
werden…