Python :: Aufgabe #77
3 Lösungen

Das Damenproblem (Teil II)
Fortgeschrittener - Python
von ElPapito
- 07.05.2015 um 11:45 Uhr
Das verallgemeinerte Damenproblem besteht aus einem nxn Schachfeld und n Damen.
Die Aufgabe besteht darin die n Damen so zu positionieren, dass sie sich gegenseitig nicht bedrohen, d.h. es dürfen keine zwei Damen in der gleichen Zeile/Spalte/Diagonale stehen.
Schreibe ein kleines Programm, welches für n = 1, ..., 13 ausgibt wie viele Lösungen existieren.
Die Aufgabe besteht darin die n Damen so zu positionieren, dass sie sich gegenseitig nicht bedrohen, d.h. es dürfen keine zwei Damen in der gleichen Zeile/Spalte/Diagonale stehen.
Schreibe ein kleines Programm, welches für n = 1, ..., 13 ausgibt wie viele Lösungen existieren.
Lösungen:

#allgemein: Bei jeder prüfung: alle vorhergegangenen Positionen ungleich der neuen #und alle vorhergegangenen Positionen +- Differenz ihrer Indexe (=Breitenabstand am Feld) ungleich der neuen l=[] def damenprüfung(x,y): ö=0 for ä in range(len(x)): if x[ä]==y or x[ä]+(len(x)-ä)==y or x[ä]-(len(x)-ä)==y: ö=ö+1 if ö>0: return("j") else: return("n") m=int(input("welche Feldgröße?")) l.append([]) for i in range(m): l[-1].append([i+1]) for a in range(m): l.append([]) for p in range(len(l[a])): for k in range(m): if damenprüfung(l[a][p],k+1)!="j": l[-1].append([]) for s in range(len(l[a][p])): l[-1][-1].append(l[a][p][s]) l[-1][-1].append(k+1) print("es gibt für ein", m," mal ",m,"großes Schachfeld ",len(l[-2])," Lösungen")

import sys def placeQueenInLine(pos, line): if line == len(pos): return 1 result = 0; for i in range(len(pos)): blocked = False; for j in range(line): if pos[j] == i or pos [j] - (line-j) == i or pos [j] + (line-j) == i: blocked = True break pos [line] = i if not blocked: result += placeQueenInLine (pos, line + 1); return result; def placeQueens(n): pos = [0] * n result = 0; for i in range(n//2): #Ausnutzen der Symmetrie pos [0] = i result += 2 * placeQueenInLine (pos, 1) if n % 2 == 1: pos [0] = n // 2; result += placeQueenInLine (pos, 1) return result for i in range(14): print "n = " + str(i) + ": " + str(placeQueens(i)) + " Möglichkeiten"

def eq(n, solutions, queens, fields): if len(queens) == n: solutions.append(queens) else : next_queen = [ f for f in fields if f[1] == len(queens)] # one queen per row for q in next_queen: new_queens = list(queens) new_queens.append(q) new_fields = [f for f in fields if not ( f[0]==q[0] or f[1]==q[1] or f[0]-f[1]==q[0]-q[1] or f[0]+f[1]==q[0]+q[1] )] eq(n, solutions, new_queens, new_fields) def eight_queens(): for i in range (1, 14): solutions = [] eq(i, solutions, [], [[x,y] for x in range(i) for y in range(i)]) print(str(i), ' : ' , len(solutions))