| Inhalt |
Hier ist ein kommentiertes, effizientes Python-Skript, das das Problem mittels Backtracking löst.
Es berechnet alle 92 Lösungen und gibt sie sowohl als Koordinaten-Liste als auch (optional) als visuelles Schachbrett aus.
Download “2512012008_GG_Solution8QueenProblem.py”
def solve_8_queens():
"""
Hauptfunktion, um das 8-Damen-Problem zu lösen.
"""
n = 8
solutions = []
# Das Brett wird als 1D-Liste repräsentiert:
# Der Index ist die Zeile, der Wert ist die Spalte.
# board[2] = 4 bedeutet: In Zeile 2 steht die Dame in Spalte 4.
board = [-1] * n
def is_safe(current_row, current_col):
"""
Prüft, ob es sicher ist, eine Dame an (current_row, current_col) zu setzen.
Wir müssen nur vorherige Zeilen (0 bis current_row - 1) prüfen.
"""
for row in range(current_row):
col = board[row]
# 1. Gleiche Spalte prüfen
if col == current_col:
return False
# 2. Diagonalen prüfen
# Wenn der Betrag der Differenz der Zeilen gleich dem Betrag
# der Differenz der Spalten ist, liegen sie auf einer Diagonalen.
if abs(current_row - row) == abs(current_col - col):
return False
return True
def backtrack(row):
"""
Rekursive Funktion, die versucht, Damen Zeile für Zeile zu platzieren.
"""
# Basisfall: Wenn wir Zeile 8 erreichen, haben wir alle 8 Damen platziert.
if row == n:
solutions.append(list(board)) # Lösung speichern
return
# Versuche jede Spalte in der aktuellen Zeile
for col in range(n):
if is_safe(row, col):
board[row] = col # Dame setzen
backtrack(row + 1) # Weiter zur nächsten Zeile
# Backtracking passiert hier automatisch, indem die Schleife
# weiterläuft und board[row] im nächsten Durchlauf überschrieben wird.
# Start der Rekursion bei Zeile 0
backtrack(0)
return solutions
def print_board(board):
"""
Hilfsfunktion, um eine Lösung visuell als Brett auszugeben.
"""
n = len(board)
print(" " + " ".join(str(i) for i in range(n))) # Spaltennummern
print(" " + "-" * (2 * n))
for row in range(n):
line = f"{row}|" # Zeilennummer
queen_col = board[row]
for col in range(n):
if col == queen_col:
line += " Q"
else:
line += " ."
print(line)
print()
# --- Hauptprogramm ---
if __name__ == "__main__":
print("Berechne Lösungen für das 8-Damen-Problem...\n")
alle_loesungen = solve_8_queens()
anzahl = len(alle_loesungen)
print(f"Es wurden insgesamt {anzahl} Lösungen gefunden.")
print("-" * 30)
# Abfrage, ob alle ausgegeben werden sollen
print("Hier ist die erste gefundene Lösung als Beispiel:\n")
print_board(alle_loesungen[0])
# Hinweis: Um alle 92 zu sehen, können wir über die Liste iterieren.
# Hier geben wir alle aus (Achtung: lange Ausgabe in der Konsole!)
print(f"--- Ausgabe aller {anzahl} Lösungen ---")
for i, sol in enumerate(alle_loesungen):
print(f"Lösung Nr. {i+1}: {sol}")
# Wenn du jedes Brett grafisch sehen willst, entkommentiere die nächste Zeile:
# print_board(sol)
Das Board (Die Datenstruktur): Anstatt einer 8x8
Matrix verwenden wir eine einfache Liste
board = [-1, -1, ...].
board[0] = 3 bedeutet: In Zeile 0
steht die Dame in Spalte 3.Die is_safe Funktion: Bevor wir
eine Dame setzen, prüfen wir:
col == current_col)abs(x1 - x2) == abs(y1 - y2).Backtracking: Der Algorithmus platziert eine Dame, geht in die nächste Zeile und versucht es dort erneut. Wenn er in einer Sackgasse landet (kein Platz sicher), geht er einen Schritt zurück (“backtrackt”) und schiebt die vorherige Dame ein Feld weiter.
| Inhalt |