from functools import reduce;
def sindBedroht(zelle1,zelle2):
(i,k)=zelle1;
(m,n)=zelle2;
return (k==n)or(i+k==m+n)or(i-k==m-n)or(i==m);
def istVertraeglichMit(damenListe,zelle):
if damenListe==[]: return True;
istSicher=[not sindBedroht(dame,zelle)
for dame in damenListe];
return reduce(lambda x,y: x and y, istSicher);
def nDamenProblem(anzahlDamen):
def setzeDame(reihe):
if reihe==0: return [[]];
return([loesung+[(reihe,spalte)]
for loesung in setzeDame(reihe-1)
for spalte in range(1,anzahlDamen+1)
if istVertraeglichMit(loesung,(reihe,spalte))]);
return setzeDame(reihe=anzahlDamen);
if __name__ == '__main__':
print('\n# Beginning Test ...\n');
damen=[];
istSicher=istVertraeglichMit(damen,(1,1));
assert istSicher;
damen=[(1,8),(2,4),(3,1),(4,3),(6,2),(7,7),(8,5)];
istSicher=istVertraeglichMit(damen,(5,6));
assert istSicher;
istSicher=istVertraeglichMit(damen,(5,7));
assert not istSicher;
istSicher=istVertraeglichMit(damen,(5,1));
assert not istSicher;
istSicher=istVertraeglichMit(damen,(6,6));
assert not istSicher;
bedroht=sindBedroht((1,1),(1,8));
assert bedroht;
if False:
nMax=13;
for n in range(1,nMax):
loesung=nDamenProblem(n);
print('N: ',n,' | Anzahl: ',len(loesung));
if True:
N=5;
loesung=nDamenProblem(N);
print('\n',loesung,'\n\nN: ',N,' | Anzahl: ',len(loesung),'\n');
print('\n# Finished Test.\n');