Last active
August 29, 2015 13:57
-
-
Save vodik/9541832 to your computer and use it in GitHub Desktop.
fun with n-queen
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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