RosettaCodeData/Task/N-queens-problem/Python/n-queens-problem-9.py

35 lines
1.1 KiB
Python

def queens(n):
def q(pl, r):
def place(c):
return r+c not in pl[1] and r-c not in pl[2]
return ((pl[0]+[c], pl[1]|{r+c}, pl[2]|{r-c}, pl[3]-{c})
for c in pl[3] if place(c))
def pipeline(pl, i):
for ipl in q(pl, i):
if i+1 < n:
yield from pipeline(ipl, i+1)
else:
yield ipl[0]
def toletter(x):
return 'abcdefghijklmnopqrstuvwxyz'[x]
def fund_solut(fl):
def inversed(xl):
return (xl.index(i) for i in range(0, n))
def variants(xl):
rl = [xl]
rl += [[*inversed(x)] for x in rl]
rl += [[*reversed(x)] for x in rl]
rl += [[n-1-i for i in x] for x in rl]
return (''.join(toletter(i) for i in x) for x in rl)
rs = set()
for i in fl:
ks = {*variants(i)}
if rs.isdisjoint(ks):
rs |= ks
yield i
for i in fund_solut(
pipeline(([], set(), set(), {*range(0, n)}), 0)):
rl = sorted(toletter(v)+str(k+1) for k, v in enumerate(i))
print(rl)
queens(8)