Studium · Hausarbeit · Lesezeit ca. 2 Minuten
Das Damenproblem: Backtracking statt Brute Force
Das Damenproblem – klassische Lösungsansätze und eine Umsetzung mit Backtracking
Zusammenfassung von Denis Zlatanović
- Fragestellung
- Wie lässt sich das Damenproblem algorithmisch lösen – und warum ist Backtracking dem reinen Ausprobieren überlegen?
- Vorgehen
- Vergleich von Brute Force und Backtracking, schrittweise Umsetzung in C++ (Datenstrukturen, Rekursion, Ausgabe), Optimierungen und Komplexitätsbetrachtung.
- Ergebnis
- Backtracking verwirft ungültige Teillösungen sofort und spart so große Teile des Suchraums; Symmetriebrechung reduziert den Aufwand weiter.
Hausarbeit · Modul Konzepte der Programmierung · 2024
Die Aufgabe klingt einfach: Acht Damen sollen so auf ein Schachbrett gestellt werden, dass keine eine andere bedroht – also keine zwei in derselben Reihe, Spalte oder Diagonale. Veröffentlicht wurde das Problem 1848 von Max Bezzel, später beschäftigte sich auch Franz Nauck damit.
Spannend wird es, sobald man es einem Computer beibringen will. Meine Hausarbeit zeigt, warum der naheliegende Weg langsam ist und wie Backtracking das Problem elegant löst.
Warum das Problem schwer ist
Für die Zahl der Lösungen gibt es keine einfache Formel. Man muss sie suchen. Mit jeder zusätzlichen Reihe wächst die Zahl der möglichen Anordnungen stark an, und auf größeren Brettern wird die Rechenarbeit schnell enorm. Genau deshalb ist das Damenproblem ein klassisches Lehrbeispiel für Suchalgorithmen.
- Brute Force
- Probiert Anordnungen durch und prüft spät – viele Wege führen bekannt in Sackgassen.
- Backtracking
- Prüft nach jeder gesetzten Dame und kehrt sofort um, wenn eine Reihe keinen sicheren Platz mehr hat.
Keine zwei Damen teilen Reihe, Spalte oder Diagonale. Daneben: Backtracking bricht ungültige Wege sofort ab.
Brute Force: alles ausprobieren
Der einfachste Ansatz probiert systematisch Platzierungen durch und prüft am Ende, ob sie gültig sind. Das ist leicht zu verstehen und umzusetzen, aber ineffizient: Viele Kombinationen werden weiter verfolgt, obwohl längst feststeht, dass sie in einer Sackgasse enden. Für kleine Bretter und für den Unterricht ist das in Ordnung, für größere nicht.
Backtracking: früh umkehren
Backtracking setzt die Damen Reihe für Reihe und prüft bei jedem Schritt sofort, ob die neue Dame bedroht wird. Findet sich in einer Reihe kein sicheres Feld mehr, geht der Algorithmus eine Reihe zurück und versetzt die vorherige Dame. Ganze Äste des Suchbaums werden so abgeschnitten, bevor sie Rechenzeit kosten.
Dieses Prinzip – Entscheidung treffen, prüfen, bei Bedarf zurücknehmen – ist der eigentliche Lerninhalt. Es taucht überall dort auf, wo unter festen Regeln eine passende Kombination gesucht wird, etwa bei Stundenplänen, Rätseln oder der Belegung von Ressourcen.
Die Umsetzung in sieben Schritten
In der Arbeit entsteht die Lösung in C++ Schritt für Schritt: Zuerst werden Datenstrukturen und Variablen festgelegt, dann das Brett initialisiert. Kern ist eine rekursive Backtracking-Funktion, die für jede Reihe ein sicheres Feld sucht. Eine Ausgabefunktion stellt die gefundenen Lösungen als Brett dar, eine Hauptfunktion startet den Ablauf.
Danach folgen Erweiterungen: Hilfsstrukturen, mit denen sich belegte Spalten und Diagonalen schneller prüfen lassen, das Parallelisieren von Teilaufgaben und eine grafische statt rein textbasierte Darstellung. Zum Abschluss steht eine Betrachtung der Komplexität.
Symmetrie als Abkürzung
Ein Schachbrett ist symmetrisch. Jede Lösung hat deshalb gedrehte und gespiegelte Varianten, die eigentlich dieselbe Lösung sind. Wer diese Symmetrie ausnutzt, muss nur einen Teil des Suchraums durchsuchen und kann die übrigen Lösungen ableiten – ein einfacher Gedanke mit großer Wirkung auf die Rechenzeit.
Was ich daraus mitnehme
Die Arbeit war für mich ein Einstieg in algorithmisches Denken: ein Problem präzise beschreiben, Regeln in Code übersetzen und darüber nachdenken, wo Rechenzeit verloren geht. Die wichtigste Lektion gilt weit über Schach hinaus – Sackgassen früh erkennen ist oft wertvoller als schneller zu rechnen.
Quellen der Arbeit · 4
- 01Boles, D. & Boles, C. (2013). Spielend objektorientierte Programmierung lernen mit dem Java-Hamster-Modell. Vieweg+Teubner.
- 02Burgess, M. & Hale-Evans, R. (2003). Das GNU C Programmier-Tutorial. Free Software Foundation.
- 03Kernighan, B. & Ritchie, D. (2004). Die Programmiersprache C (ANSI C). Pearson.
- 04Wegener, I. (2013). Highlights aus der Informatik. Springer.