35 lines
1.1 KiB
Python
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)
|