StyleInCode

RSS

 

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))

permalink


Categories

Links