Skip to content

Instantly share code, notes, and snippets.

@vodik
Last active August 29, 2015 13:57
Show Gist options
  • Save vodik/9541832 to your computer and use it in GitHub Desktop.
Save vodik/9541832 to your computer and use it in GitHub Desktop.
fun with n-queen
#!/usr/bin/python3
def make_solution(size):
def exception_queen(i, half):
return 2 * i + half - 3
def simple_queen(i, half):
return 2 * i - 1
table = [0] * size
half = int(size / 2)
n = half * 2
solver = exception_queen if (half - 1) % 3 == 0 else simple_queen
for i in range(1, half + 1):
queen = solver(i, half)
table[i - 1] = 1 + queen % n
table[n - i] = n - queen % n
if size % 2 == 1:
table[size - 1] = size
return table
def verify_solution(array):
def step(table):
if not table:
return True
(x1, y1), *tail = table
for (x2, y2) in tail:
if y1 == y2:
return False
if abs(y2 - y1) == abs(x1 - x2):
return False
return step(tail)
return step(enumerate(array))
def print_table(table):
n = len(table)
for queen in table:
print("{}Q {}".format(". " * (queen - 1), ". " * (n - queen)))
for n in range(4, 40):
table = make_solution(n)
verified = verify_solution(table)
print("n {} is {}".format(n, "valid" if verified else "invalid"))
print_table(table)
print()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment