faecher:informatik:oberstufe:algorithmen:rekursion:backtracking:sudoku-loeser:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:algorithmen:rekursion:backtracking:sudoku-loeser:start [04.07.2024 07:49] – [Algorithmus] Marco Kuemmelfaecher:informatik:oberstufe:algorithmen:rekursion:backtracking:sudoku-loeser:start [27.02.2025 14:06] (aktuell) Frank Schiebel
Zeile 13: Zeile 13:
  
 **Vorüberlegungen:** **Vorüberlegungen:**
-  * In der nachfolgend gegebenen {{ .:sudoku.zip |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:+ 
 +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 | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Zeile 27: Zeile 28:
   * 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.   * 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'' im ''spielfeld'' gespeichert.   * Beim Start des Sudoku-Lösers werden leere Zellen (bei denen kein Startwert vorgegeben war) als ''0'' im ''spielfeld'' gespeichert.
 +  * Achtet darauf, dass ihr Felder, die bereits vorbelegt sind, nicht überschreibt!
  
 {{:aufgabe.png?nolink  |}} {{:aufgabe.png?nolink  |}}
 === (A1) ===  === (A1) === 
  
-  - Lade die {{ .:sudoku.zip |Vorlage}} herunter und mache dich rudimentär mit der Funktionsweise des Programms / der GUI vertraut. Du musst den bereits vorgegebenen Code **nicht** nachvollziehen.+  - Lade die [[https://codeberg.org/qg-info-unterricht/bluej-sudoku-fx|Vorlage]] herunter, starte die JavaFX-Anwenung und  mache dich rudimentär mit der Funktionsweise des Programms / der GUI vertraut. Du musst den bereits vorgegebenen Code für die GUI **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.   - Du kannst in der GUI einzelne Zahlen vorgeben und dann auf den Knopf "Lösen" klicken. Daraufhin wird die Methode ''loeseSudoku(0)'' aufgerufen.
-  - Implementiere diese Methode ''loeseSudoku(int feld)'' sowie die Methode ''istFehlerfrei()''. Nachfolgend findest du Tipps in Form von Pseudocode sowie Lösungsvorschläge.+  - Mit dem Auswahlfeld, kannst du einige Sudokus laden. 
 +  - Im Unterverzeichnis ''sudokus'' befinden sich zwei Sudoku-Dateien, die du selbst anpassen kannst, so dass du deine eigenen Sudokus in der GUI laden kannst. 
 +  - 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. 
  
 ++++ Pseudocode Löse-Algorithmus | ++++ Pseudocode Löse-Algorithmus |
Zeile 59: Zeile 68:
 </code> </code>
 ++++ ++++
 +
 +**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:
 +<code java> 
 +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,
 +};
 +</code>
 +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...
 +
 +
  
 ++++ Lösungsvorschlag loeseSudoku()|  ++++ Lösungsvorschlag loeseSudoku()| 
  • faecher/informatik/oberstufe/algorithmen/rekursion/backtracking/sudoku-loeser/start.1720079372.txt.gz
  • Zuletzt geändert: 04.07.2024 07:49
  • von Marco Kuemmel