Eight Queens Puzzle
A solution to the Eight Queens Puzzle.
Solution
""" eight_queens.py """
# usage: python3 eight_queens.py 8
import sys
def valid(n, attempt):
""" is attempt valid so far for size n """
rows = {i // n for i in attempt}
if len(rows) != len(attempt):
return False
cols = {i % n for i in attempt}
if len(cols) != len(attempt):
return False
diag = set()
d, r = divmod(attempt[-1], n)
while d > 0 and r > 0:
d -= 1
r -= 1
while d < n and r < n:
diag.add(d * n + r)
d += 1
r += 1
if len(diag & set(attempt)) > 1:
return False
diag = set()
d, r = divmod(attempt[-1], n)
while d > 0 and r < n - 1:
d -= 1
r += 1
while d < n and r >= 0:
diag.add(d * n + r)
d += 1
r -= 1
if len(diag & set(attempt)) > 1:
return False
return True
size = int(sys.argv[1])
solutions = []
i = 0
bid = [i]
while bid[0] < size:
if i == size * size:
bid.pop()
i = bid.pop()
elif not valid(size, bid):
bid.pop()
elif len(bid) == size:
solutions.append(bid.copy())
i = bid.pop()
i += 1
bid.append(i)
print(len(solutions))
