Das Damenproblem
Das Damenproblem ist ein gutes Beispiel für ein einfach zu formulierendes Problem mit
nicht-trivialen Lösungen.
wikipedia
Das Damenproblem ist eine schachmathematische Aufgabe.
Es sollen jeweils acht
Damen auf einem Schachbrett so aufgestellt werden, dass keine zwei Damen einander gemäß
ihren in den Schachregeln definierten Zugmöglichkeiten schlagen können.
Die Figurenfarbe
wird dabei ignoriert, und es wird angenommen, dass jede Figur jede andere angreifen
könnte. Solcherart auf dem Schachbrett angeordnete Figuren werden auch als „unabhängig“
bezeichnet.
Für Damen heißt dies konkret und anders ausgedrückt: Es dürfen keine zwei
Damen auf derselben Reihe, Linie oder Diagonale
stehen.
Das Problem kann auf quadratische Schachbretter beliebiger Größe
verallgemeinert werden: Dann gilt es, n
unabhängige Damen auf einem Brett von
n × n
Feldern zu positionieren (mit n
als Parameter aus den natürlichen
Zahlen n ∈ ℕ
.
Motivation
-
abstrakte Abbildung von realen "Dingen"
- Dame
- Schachbrett
- Spiel (Dame mit Schachbrett verbinden)
- Zustände festhalten
- alle Lösungen
- Höhere Basistypen
- Arrays
- Maps
- Sets
- Rekursion
- Funktionen die sich selbst wieder aufrufen.
- Parameter werden angepasst (aktuelle Tiefe, …).
- Abbruchbedingung ist essentiell (→ Endlosschleife).
- Duplikate finden
- Spiegelsymetrie
- Rotationssymmetrie
- Didaktik
- Umsetzten und erlernen von etwas Unbekanntem
Das Spielbrett
8 |
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
A |
B |
C |
D |
E |
F |
G |
H |
Das Spielbrett: Datentyp
7 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
6 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
5 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
4 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
3 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
2 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
0 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
multidimensionales Array
Das Spielbrett
2 |
6 |
7 |
8 |
1 |
3 |
4 |
5 |
0 |
0 |
1 |
2 |
|
0 |
1 |
2 |
im Speicher mit Größe n=3 und Index f
feld |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
x,y |
0,0 |
1,0 |
2,0 |
0,1 |
1,1 |
2,1 |
0,2 |
1,2 |
2,2 |
Array
Das Spielbrett
feld |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
x,y |
0,0 |
1,0 |
2,0 |
0,1 |
1,1 |
2,1 |
0,2 |
1,2 |
2,2 |
im Speicher mit Größe n=3 und Index f
Welche Felder bedroht eine Dame
7 |
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
|
|
♕ |
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Welche Felder bedroht eine Dame
7 |
|
|
b1 |
|
|
|
c1 |
|
6 |
|
|
|
|
|
|
|
|
5 |
d2 |
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
a2 |
|
♕ |
|
|
|
|
a1 |
2 |
|
|
|
|
|
|
|
|
1 |
c2 |
|
|
|
|
|
|
|
0 |
|
|
b2 |
|
|
d1 |
|
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Geraden
Welche Felder bedroht eine Dame
Mit durchgehenden Geraden
7 |
|
|
b |
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
5 |
d |
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
a |
|
♕ |
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
1 |
c |
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Geraden
m = n - 1 = 8 - 1 = 7
ma = min(x, m-y) = min(2, 7-3) = min(2, 4) = 2
mb = min(y, m-x) = min(3, 7-2) = min(3, 5) = 3
mc = min(x, y) = min(2, 3) = 2
md = min(m-x, m-y) = min(7-2, 7-3) = min(5, 4) = 4
Lösungansatz
recursive backtracking
- Rekursiv
Funktionen die sich selbst mit veränderten Parametern aufrufen
- Backtracking
Algorithmus der ohne Datenverlust einen Schritt zurückgehen kann
-
Optimierungen
- Setze pro Spalte nur eine Dame (88 ≈ 16 Millionen)
Nachteil: kann nicht ohne Änderungen für Springer und Läufer angewendet
werden
- Ist ein Dame am rechten Rand angekommen gehe einen weiteren Schritt zurück (≈ 1
Million)
Beschreibung
- Start
Setze ein Dame auf das erste Feld
- Schritt
- Damen setzten
Gehe die Felder der Reihe nach durch, bis zum nächsten Feld ohne
Bedrohung
und setzte die nächste Dame.
- Backtracking
- Sind noch nicht alle Damen gesetzt, aber kein Feld mehr frei, nimm
die letzte Dame vom Brett und wiederhole den oberen Schritt.
- Ist eine Dame am rechten Rand angekommen nimm
eine weiter Damen vom Brett und wiederhole den oberen Schritt.
- weitere Lösungen
Sind alle Damen gesetzt, speichere die Lösung ab, nimm die letzte Dame aus
dem
Spiele und wiederhole die oberen Schritte.
- Beendung des Algorithmus
Ist die erste Dame auf dem letzten Feld, ist die Suche beendet.
Showcase
8 |
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
A |
B |
C |
D |
E |
F |
G |
H |
Die Anzahl der Möglichkeiten
Brute Force
Anzahl für optimierte Lösung
88 ≈ 16 Millionen
Anzahl für größere Bretter
8: 64! / 56! = 2 × 1014
9: 81! / 72! = 9 × 1016
10: 100! / 90! = 6 × 1019
11: 121! / 110! = 5 × 1022
12: 144! / 132! = 4 × 1025
Anzahl der Lösungen
92 Lösungen
12 indiviudelle Lösungen
{H, V, D1, D2, 0°, 90° 180° 270°} × 12 = 8 × 12 = 96
ein Lösung ist Rotationsidentisch
12 × 8 - 4 = 96 - 4 = 92
Spiegel-symetrische Lösungen
7 |
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
♛
|
|
|
5 |
|
♛
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
2 |
|
♛ |
|
|
|
|
♛
|
|
1 |
|
|
♛
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
|
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
m = n - 1 = 8 - 1 = 7
Horizontal
Vertikal
Hauptdiagonale
Nebendiagonale
Rotations-symetrische Lösungen
4i |
|
|
|
|
|
|
|
|
3i |
|
|
♛
|
|
|
|
|
|
2i |
|
|
|
|
|
|
♛
|
|
1i |
|
|
|
|
|
|
|
|
-1i |
|
|
|
|
|
|
|
|
-2i |
|
♛
|
|
|
|
|
|
|
-3i |
|
|
|
|
|
♛
|
|
|
-4i |
|
|
|
|
|
|
|
|
|
-4 |
-3 |
-2 |
-1 |
1 |
2 |
3 |
4 |
Drehen
0° → 90° → 180° → 270°
Wie drehen? → Komplexe Zahlen
Komplexe Zahlen
i = -1
→ i2 = -1
Nullpunkt justieren
Drehung durchführen
Nullpunkt re-justieren
x = Re(a + m)
y = Im(b + m)
The Game
iterations
game
8 |
|
|
|
|
|
|
|
|
7 |
|
|
|
|
|
|
|
|
6 |
|
|
|
|
|
|
|
|
5 |
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
A |
B |
C |
D |
E |
F |
G |
H |
solutions