Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:rekursion:backtracking:8-damen-problem:start [25.02.2025 07:40] – Frank Schiebel | faecher:informatik:oberstufe:algorithmen:rekursion:backtracking:8-damen-problem:start [25.02.2025 14:44] (aktuell) – [Algorithmus unplugged] Frank Schiebel | ||
---|---|---|---|
Zeile 9: | Zeile 9: | ||
==== Algorithmus unplugged ==== | ==== Algorithmus unplugged ==== | ||
- | Wie würde man das Problem algorithmisch lösen? Am besten | + | Wie würde man das Problem algorithmisch lösen? Am besten |
<WRAP center round info 75%> | <WRAP center round info 75%> | ||
Lies hier erst weiter, nachdem du dir selbst Gedanken gemacht hast, wie du vorgehen könntest. | Lies hier erst weiter, nachdem du dir selbst Gedanken gemacht hast, wie du vorgehen könntest. | ||
Zeile 25: | Zeile 25: | ||
<code java> | <code java> | ||
- | // die Methode | + | // die Methode |
- | reihe(r): | + | // die übergebene |
- | wenn r < 8: | + | befuelleZeile(zeile): |
- | für jede Spalte s (0-7): | + | wenn zeile < 8: |
- | wenn die Spalte frei ist: // lagere die Überprüfung in separate Methode aus! | + | für spalte von 0 bis 7: |
- | setze Dame ins Feld [r][s] | + | wenn istPositionErlaubt(zeile, |
- | | + | setze Dame ins Feld [zeile][spalte] |
- | wenn kollisionsfrei auf Diagonalen: | + | |
- | reihe(r+1) | + | |
- | + | ||
- | // wenn ich wieder aus der Rekursion zurückkomme ODER wenn es eine diagonale Kollision gab: | + | |
- | | + | |
sonst: | sonst: | ||
- | druckeFeld() | + | druckeFeld() |
</ | </ | ||
Man startet diese Methode mit dem Aufruf von '' | Man startet diese Methode mit dem Aufruf von '' | ||
Zeile 45: | Zeile 42: | ||
=== (A1) === | === (A1) === | ||
- | - Lade die {{ .: | + | Arbeite |
- | - Überlege dir, welcher **Datentyp** für das Spielfeld sinnvoll ist. Setze den Typ in der Instanzvariablen und initialisiere das Spielfeld / die Variable im Konstruktor. | + | |
- | - Implementiere den Pseudocode im vorgegebenen Methodengerüst. Für die Kollisionsprüfung auf der Diagonalen kannst du die bereits vergegebene Methode '' | + | |
- | - '' | + | |
- | | + | |
- | Um zu testen, ob eine Dame an eine bestimmte Position gesetzt werden darf, implementiert man die Methode | + | **(A)** Modelliere das Feld mit einem zweidimensionalen Array des Typs '' |
+ | |||
+ | **(B)** Implementiere eine Methode '' | ||
+ | |||
+ | **(C)** Implementiere eine Testmethode, | ||
+ | |||
+ | Um zu testen, ob eine Dame an eine bestimmte Position gesetzt werden darf, implementiert man die Methode | ||
+ | <code java> | ||
+ | boolean | ||
+ | </ | ||
+ | Diese gibt '' | ||
Einige Überlegungen zu dieser Methode: | Einige Überlegungen zu dieser Methode: | ||
Zeile 59: | Zeile 62: | ||
- Wir müssen also nur die Diagonalen oberhalb und die Spalte oberhalb der Position überprüfen, | - Wir müssen also nur die Diagonalen oberhalb und die Spalte oberhalb der Position überprüfen, | ||
- | Die folgende | + | Die Skizze stellt die Situation dar. Jetzt kann man sich überlegen, wie man an die Koordinaten der " |
- | {{ : | ||
- | Jetzt kann man sich überlegen, wie man an die Koordinaten der " | + | {{ :faecher: |
* Die Felder in der Zeile oberhalb der aktuellen Position haben die Koordinaten '' | * Die Felder in der Zeile oberhalb der aktuellen Position haben die Koordinaten '' | ||
+ | * Wenn man mit der Variablen '' | ||
+ | |||
+ | **(D)** Teste deine Methode '' | ||
+ | |||
+ | * Erzeuge ein Schachbrett 8x8 | ||
+ | * Setze eine Dame auf das Feld '' | ||
+ | * Überprüfe, | ||
+ | |||
+ | ++++ Hilfestellung 1 zu " | ||
+ | <code java> | ||
+ | public boolean istPositionErlaubt(int zeile, int spalte) { | ||
+ | // Füge hier deinen Code für die Kollisionserkennung ein. | ||
+ | // Einen Lösungsvorschlag findest du im Wiki | ||
+ | |||
+ | // Alle Zeilen von 0 bis zeile-1 untersuchen: | ||
+ | for(int zeileAktuell=0; | ||
+ | // Felder oberhalb untersuchen, | ||
+ | // return false | ||
+ | if( FIXME ) { | ||
+ | return false; | ||
+ | } | ||
+ | // Felder der Diagonalen untersuchen, | ||
+ | // return false | ||
+ | // Linke Diagonale | ||
+ | if( FIXME ) { | ||
+ | return false; | ||
+ | } | ||
+ | // Rechte Diagonale | ||
+ | if( FIXME ) { | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | return true; | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ++++ | ||
+ | |||
+ | ++++ Lösungsvorschlag zu " | ||
+ | <code java> | ||
+ | public boolean istPositionErlaubt(int zeile, int spalte) { | ||
+ | // Füge hier deinen Code für die Kollisionserkennung ein. | ||
+ | // Einen Lösungsvorschlag findest du im Wiki | ||
+ | |||
+ | // Alle Zeilen von 0 bis zeile-1 untersuchen: | ||
+ | for(int zeileAktuell=0; | ||
+ | // Felder oberhalb untersuchen, | ||
+ | // return false | ||
+ | if(feld[zeileAktuell][spalte]) { | ||
+ | return false; | ||
+ | } | ||
+ | // Felder der Diagonalen untersuchen, | ||
+ | // return false | ||
+ | if(spalte - (zeile-zeileAktuell) >= 0 && feld[zeileAktuell][spalte - (zeile-zeileAktuell)] ) { | ||
+ | return false; | ||
+ | } | ||
+ | if( spalte + (zeile-zeileAktuell) < SIZE && feld[zeileAktuell][spalte + (zeile-zeileAktuell)] ) { | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | return true; | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | ++++ | ||
+ | |||
+ | **(E)** Wenn du geprüft hast, dass deine '' | ||
+ | |||
+ | Teste die Methode mit Schachbrettern 4x4 und 8x8. Überprüfe die ausgegebenen Lösungen stichprobenartig. | ||
+ | |||
{{: | {{: | ||
=== (A2) === | === (A2) === | ||
- | Was ist der Basisfall dieser Rekursion? | ||
+ | Was ist der Basisfall dieser Rekursion? Finde einen Weg, dir mit dem Debugger den Stack anzeigen zu lassen, wenn der Basisfall eintritt. Was fällt dir dabei auf? | ||
{{: | {{: | ||
- | === (A3) - Für die Schnellen | + | === (A3) === |
- | Erweitere das Programm: Lass dir ausgeben, wie viele Lösungen gefunden wurden. | + | Erweitere das Programm: Lass dir ausgeben, wie viele Lösungen gefunden wurden. |
- | {{: | ||
- | === (A4) - Für die Schnellen === | ||
- | Wenn du früh fertig bist, dann kannst du überlegen, ob du selbst eine andere/ | ||
<WRAP center round info 75%> | <WRAP center round info 75%> | ||
Zeile 84: | Zeile 156: | ||
https:// | https:// | ||
</ | </ | ||
+ | |||
+ | |||
+ | ==== Material ==== | ||
+ | |||
+ | {{simplefilelist>: | ||
+ | |||