Python :: Aufgabe #77

3 Lösungen Lösungen öffentlich

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.

Lösungen:

vote_ok
von Veigar (1120 Punkte) - 11.12.2015 um 16:27 Uhr
Quellcode ausblenden Python-Code
#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")
vote_ok
von eulerscheZhl (5230 Punkte) - 01.01.2016 um 09:16 Uhr
Quellcode ausblenden Python-Code
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"
vote_ok
von hak (980 Punkte) - 13.09.2016 um 19:37 Uhr
Quellcode ausblenden Python-Code
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))
2098566

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.