Algorithm NQueens ( k, n) //Prints all Solution to the n-queens problem
{
for i := 1 to n do
{
if Place (k, i) then
{
x[k] := i;
I've just decided to code my solution of N Queens Puzzle in Python language, down below is code, it is quite fast, in dozens of seconds it finds all solutions for 1-8 queens and in few minutes for 9 queens. It tests agains reference numbers in Counting Solutions section of wiki.
Solution uses recursive back-tracking approach and fast numpy library, also it searches solutions only in lexicographical order of combinations, all permutations of queens in same positions are considered to be same and all permutations except first are not searched at all. So algorithm is quite fast.
Try it online!
def Main():
import numpy as np
con_width = 80 # Console width
for h, w, n, rcnt in [
# h - heignt, w - width, n - num queens
# Create all tests here
] + [(i + 1, i + 1, i + 1, rcnt) for i, rcnt in enumerate([
# See https://oeis.org/A000170/b000170.txt
1, 0, 0, 2, 10, 4, 40, 92, 352, 724, 2680, 14200, 73712, 365596, 2279184, 14772512, 95815104, 666090624, 4968057848, 39029188884,
])]:
# Create empty board
board = np.zeros([h, w], dtype = np.int8)
sols = {}
# Recursive function for placing next queen using back-propagation
def Solve(*, qcnt = 0, fy = 0, fx = 0):
nonlocal board, sols
if qcnt >= n:
sola = np.nonzero(board > 0)
sol = tuple((y, x) for y, x in zip(sola[0].tolist(), sola[1].tolist()))
assert sol not in sols
sols[sol] = np.copy(board)
return
# Find coordinates of all available positions (zeroes)
av = np.nonzero(board == 0)
# Skip previous placed results
ava = np.vstack(av).T
avc = np.count_nonzero((ava[:, 0] < fy) | ((ava[:, 0] == fy) & (ava[:, 1] < fx)))
av = (av[0][avc:], av[1][avc:])
for i in range(av[0].shape[0]):
# Get next available position
y, x = av[0][i], av[1][i]
assert board[y, x] == 0, (y, x, board[y, x])
# Try placing queen into (y, x)
ps = np.zeros([2, 0], dtype = np.int32)
# Same row
ps = np.concatenate((ps, [np.full([w], y), np.arange(w)]), 1)
# Same column
ps = np.concatenate((ps, [np.arange(h), np.full([h], x)]), 1)
# Same primary diagonal
if y < x:
dlen = min(h, w - (x - y))
ps = np.concatenate((ps, [np.arange(dlen), np.arange(x - y, x - y + dlen)]), 1)
else:
dlen = min(w, h - (y - x))
ps = np.concatenate((ps, [np.arange(y - x, y - x + dlen), np.arange(dlen)]), 1)
# Same secondary diagonal
dlen = min(h, w, x + y + 1)
ps = np.concatenate((ps, [
np.arange((x + y) - min(x + y, w - 1), min(x + y, h - 1) + 1),
np.arange(min(x + y, w - 1), max(0, x + y - (h - 1)) - 1, -1),
]), 1)
ps = (ps[0, :].astype(np.int32), ps[1, :].astype(np.int32))
#print('placing', qcnt + 1, '(', y, x, ')\n', ps, '\n', board)
# Backup current values in positions
cvs = np.copy(board[ps])
# Attack all positions
board[ps] = -1
# Place queen
board[y, x] = qcnt + 1
#print('placed\n', board)
# Recurse
Solve(qcnt = qcnt + 1, fy = (y + 1, y)[bool(x + 1 < w)], fx = (x + 1) % w)
# Undo placed queen and attacked positions
board[ps] = cvs
print(f'Testing: h = {h}, w = {w}, n = {n}, sols = {rcnt}\n')
Solve()
lcnt = con_width // (w + 1)
sols = sorted(sols.items(), key = lambda e: e[0])
for ibl in range((len(sols) + lcnt - 1) // lcnt):
for l in range(h):
for i in range(ibl * lcnt, min((ibl + 1) * lcnt, len(sols))):
sol = sols[i][1]
print(''.join([('.', 'X')[e] for e in (sol[l, :] > 0).astype(np.uint8).tolist()]) + ' ', end = '')
print()
print()
num_sols = len(sols)
print(f'Result: h = {h}, w = {w}, n = {n}, sols = {num_sols}')
print('-' * con_width)
if rcnt is not None:
assert num_sols == rcnt, (h, w, n, num_sols, rcnt)
Main()
It outputs:
Testing: h = 1, w = 1, n = 1, sols = 1
X
Result: h = 1, w = 1, n = 1, sols = 1
--------------------------------------------------------------------------------
Testing: h = 2, w = 2, n = 2, sols = 0
Result: h = 2, w = 2, n = 2, sols = 0
--------------------------------------------------------------------------------
Testing: h = 3, w = 3, n = 3, sols = 0
Result: h = 3, w = 3, n = 3, sols = 0
--------------------------------------------------------------------------------
Testing: h = 4, w = 4, n = 4, sols = 2
.X.. ..X.
...X X...
X... ...X
..X. .X..
Result: h = 4, w = 4, n = 4, sols = 2
--------------------------------------------------------------------------------
Testing: h = 5, w = 5, n = 5, sols = 10
X.... X.... .X... .X... ..X.. ..X.. ...X. ...X. ....X ....X
..X.. ...X. ...X. ....X X.... ....X X.... .X... .X... ..X..
....X .X... X.... ..X.. ...X. .X... ..X.. ....X ...X. X....
.X... ....X ..X.. X.... .X... ...X. ....X ..X.. X.... ...X.
...X. ..X.. ....X ...X. ....X X.... .X... X.... ..X.. .X...
Result: h = 5, w = 5, n = 5, sols = 10
--------------------------------------------------------------------------------
Testing: h = 6, w = 6, n = 6, sols = 4
.X.... ..X... ...X.. ....X.
...X.. .....X X..... ..X...
.....X .X.... ....X. X.....
X..... ....X. .X.... .....X
..X... X..... .....X ...X..
....X. ...X.. ..X... .X....
Result: h = 6, w = 6, n = 6, sols = 4
--------------------------------------------------------------------------------
Testing: h = 7, w = 7, n = 7, sols = 40
X...... X...... X...... X...... .X..... .X..... .X..... .X..... .X..... .X.....
..X.... ...X... ....X.. .....X. ...X... ...X... ....X.. ....X.. ....X.. .....X.
....X.. ......X .X..... ...X... X...... .....X. X...... ..X.... ......X ..X....
......X ..X.... .....X. .X..... ......X X...... ...X... X...... ...X... ......X
.X..... .....X. ..X.... ......X ....X.. ..X.... ......X ......X X...... ...X...
...X... .X..... ......X ....X.. ..X.... ....X.. ..X.... ...X... ..X.... X......
.....X. ....X.. ...X... ..X.... .....X. ......X .....X. .....X. .....X. ....X..
.X..... ..X.... ..X.... ..X.... ..X.... ..X.... ..X.... ...X... ...X... ...X...
......X X...... X...... ....X.. .....X. ......X ......X X...... X...... .X.....
....X.. .....X. .....X. ......X .X..... .X..... ...X... ..X.... ....X.. ......X
..X.... .X..... ...X... .X..... ....X.. ...X... X...... .....X. .X..... ....X..
X...... ....X.. .X..... ...X... X...... .....X. ....X.. .X..... .....X. ..X....
.....X. ......X ......X .....X. ...X... X...... .X..... ......X ..X.... X......
...X... ...X... ....X.. X...... ......X ....X.. .....X. ....X.. ......X .....X.
...X... ...X... ...X... ....X.. ....X.. ....X.. ....X.. ....X.. ....X.. .....X.
.....X. ......X ......X X...... X...... .X..... ..X.... ......X ......X X......
X...... ..X.... ....X.. ...X... .....X. .....X. X...... .X..... .X..... ..X....
..X.... .....X. .X..... ......X ...X... ..X.... .....X. ...X... .....X. ....X..
....X.. .X..... .....X. ..X.... .X..... ......X ...X... .....X. ..X.... ......X
......X ....X.. X...... .....X. ......X ...X... .X..... X...... X...... .X.....
.X..... X...... ..X.... .X..... ..X.... X...... ......X ..X.... ...X... ...X...
.....X. .....X. .....X. .....X. .....X. .....X. ......X ......X ......X ......X
.X..... ..X.... ..X.... ..X.... ...X... ...X... .X..... ..X.... ...X... ....X..
....X.. X...... ....X.. ......X .X..... ......X ...X... .....X. X...... ..X....
X...... ...X... ......X ...X... ......X X...... .....X. .X..... ....X.. X......
...X... ......X X...... X...... ....X.. ..X.... X...... ....X.. .X..... .....X.
......X ....X.. ...X... ....X.. ..X.... ....X.. ..X.... X...... .....X. ...X...
..X.... .X..... .X..... .X..... X...... .X..... ....X.. ...X... ..X.... .X.....
Result: h = 7, w = 7, n = 7, sols = 40
--------------------------------------------------------------------------------
Testing: h = 8, w = 8, n = 8, sols = 92
X....... X....... X....... X....... .X...... .X...... .X...... .X......
....X... .....X.. ......X. ......X. ...X.... ....X... ....X... .....X..
.......X .......X ...X.... ....X... .....X.. ......X. ......X. X.......
.....X.. ..X..... .....X.. .......X .......X X....... ...X.... ......X.
..X..... ......X. .......X .X...... ..X..... ..X..... X....... ...X....
......X. ...X.... .X...... ...X.... X....... .......X .......X .......X
.X...... .X...... ....X... .....X.. ......X. .....X.. .....X.. ..X.....
...X.... ....X... ..X..... ..X..... ....X... ...X.... ..X..... ....X...
.X...... .X...... .X...... .X...... ..X..... ..X..... ..X..... ..X.....
.....X.. ......X. ......X. .......X X....... ....X... ....X... ....X...
.......X ..X..... ....X... .....X.. ......X. .X...... .X...... ......X.
..X..... .....X.. .......X X....... ....X... .......X .......X X.......
X....... .......X X....... ..X..... .......X X....... .....X.. ...X....
...X.... ....X... ...X.... ....X... .X...... ......X. ...X.... .X......
......X. X....... .....X.. ......X. ...X.... ...X.... ......X. .......X
....X... ...X.... ..X..... ...X.... .....X.. .....X.. X....... .....X..
..X..... ..X..... ..X..... ..X..... ..X..... ..X..... ..X..... ..X.....
....X... .....X.. .....X.. .....X.. .....X.. .....X.. .....X.. .....X..
.......X .X...... .X...... .X...... ...X.... ...X.... .......X .......X
...X.... ....X... ......X. ......X. X....... .X...... X....... X.......
X....... .......X X....... ....X... .......X .......X ...X.... ....X...
......X. X....... ...X.... X....... ....X... ....X... ......X. ......X.
.X...... ......X. .......X .......X ......X. ......X. ....X... .X......
.....X.. ...X.... ....X... ...X.... .X...... X....... .X...... ...X....
..X..... ..X..... ..X..... ..X..... ...X.... ...X.... ...X.... ...X....
.....X.. ......X. ......X. .......X X....... X....... .X...... .X......
.......X .X...... .X...... ...X.... ....X... ....X... ....X... ......X.
.X...... .......X .......X ......X. .......X .......X .......X ..X.....
...X.... ....X... .....X.. X....... .X...... .....X.. .....X.. .....X..
X....... X....... ...X.... .....X.. ......X. ..X..... X....... .......X
......X. ...X.... X....... .X...... ..X..... ......X. ..X..... X.......
....X... .....X.. ....X... ....X... .....X.. .X...... ......X. ....X...
...X.... ...X.... ...X.... ...X.... ...X.... ...X.... ...X.... ...X....
.X...... .X...... .X...... .X...... .....X.. .....X.. .....X.. ......X.
......X. ......X. .......X .......X X....... .......X .......X X.......
..X..... ....X... ....X... .....X.. ....X... .X...... ..X..... .......X
.....X.. X....... ......X. X....... .X...... ......X. X....... ....X...
.......X .......X X....... ..X..... .......X X....... ......X. .X......
....X... .....X.. ..X..... ....X... ..X..... ..X..... ....X... .....X..
X....... ..X..... .....X.. ......X. ......X. ....X... .X...... ..X.....
...X.... ...X.... ...X.... ...X.... ...X.... ...X.... ....X... ....X...
......X. ......X. ......X. .......X .......X .......X X....... X.......
..X..... ....X... ....X... X....... X....... ....X... ...X.... .......X
.......X .X...... ..X..... ..X..... ....X... ..X..... .....X.. ...X....
.X...... .....X.. X....... .....X.. ......X. X....... .......X .X......
....X... X....... .....X.. .X...... .X...... ......X. .X...... ......X.
X....... ..X..... .......X ......X. .....X.. .X...... ......X. ..X.....
.....X.. .......X .X...... ....X... ..X..... .....X.. ..X..... .....X..
....X... ....X... ....X... ....X... ....X... ....X... ....X... ....X...
X....... .X...... .X...... .X...... .X...... ..X..... ..X..... ..X.....
.......X ...X.... ...X.... .....X.. .......X X....... X....... .......X
.....X.. .....X.. ......X. X....... X....... .....X.. ......X. ...X....
..X..... .......X ..X..... ......X. ...X.... .......X .X...... ......X.
......X. ..X..... .......X ...X.... ......X. .X...... .......X X.......
.X...... X....... .....X.. .......X ..X..... ...X.... .....X.. .....X..
...X.... ......X. X....... ..X..... .....X.. ......X. ...X.... .X......
....X... ....X... ....X... ....X... ....X... ....X... ....X... ....X...
......X. ......X. ......X. ......X. ......X. ......X. .......X .......X
X....... X....... .X...... .X...... .X...... ...X.... ...X.... ...X....
..X..... ...X.... ...X.... .....X.. .....X.. X....... X....... X.......
.......X .X...... .......X ..X..... ..X..... ..X..... ..X..... ......X.
.....X.. .......X X....... X....... X....... .......X .....X.. .X......
...X.... .....X.. ..X..... ...X.... .......X .....X.. .X...... .....X..
.X...... ..X..... .....X.. .......X ...X.... .X...... ......X. ..X.....
.....X.. .....X.. .....X.. .....X.. .....X.. .....X.. .....X.. .....X..
X....... .X...... .X...... ..X..... ..X..... ..X..... ..X..... ..X.....
....X... ......X. ......X. X....... X....... X....... ....X... ....X...
.X...... X....... X....... ......X. .......X .......X ......X. .......X
.......X ..X..... ...X.... ....X... ...X.... ....X... X....... X.......
..X..... ....X... .......X .......X .X...... .X...... ...X.... ...X....
......X. .......X ....X... .X...... ......X. ...X.... .X...... .X......
...X.... ...X.... ..X..... ...X.... ....X... ......X. .......X ......X.
.....X.. .....X.. .....X.. .....X.. .....X.. .....X.. .....X.. .....X..
..X..... ..X..... ..X..... ...X.... ...X.... ...X.... ...X.... .......X
......X. ......X. ......X. X....... .X...... ......X. ......X. .X......
.X...... .X...... ...X.... ....X... .......X X....... X....... ...X....
...X.... .......X X....... .......X ....X... ..X..... .......X X.......
.......X ....X... .......X .X...... ......X. ....X... .X...... ......X.
X....... X....... .X...... ......X. X....... .X...... ....X... ....X...
....X... ...X.... ....X... ..X..... ..X..... .......X ..X..... ..X.....
......X. ......X. ......X. ......X. ......X. ......X. ......X. ......X.
X....... .X...... .X...... ..X..... ..X..... ...X.... ...X.... ....X...
..X..... ...X.... .....X.. X....... .......X .X...... .X...... ..X.....
.......X X....... ..X..... .....X.. .X...... ....X... .......X X.......
.....X.. .......X X....... .......X ....X... .......X .....X.. .....X..
...X.... ....X... ...X.... ....X... X....... X....... X....... .......X
.X...... ..X..... .......X .X...... .....X.. ..X..... ..X..... .X......
....X... .....X.. ....X... ...X.... ...X.... .....X.. ....X... ...X....
.......X .......X .......X .......X
.X...... .X...... ..X..... ...X....
...X.... ....X... X....... X.......
X....... ..X..... .....X.. ..X.....
......X. X....... .X...... .....X..
....X... ......X. ....X... .X......
..X..... ...X.... ......X. ......X.
.....X.. .....X.. ...X.... ....X...
Result: h = 8, w = 8, n = 8, sols = 92
--------------------------------------------------------------------------------
Testing: h = 9, w = 9, n = 9, sols = 352
X........ X........ X........ X........ X........ X........ X........ X........
..X...... ..X...... ..X...... ...X..... ...X..... ...X..... ...X..... ...X.....
.....X... ......X.. .......X. .X....... .....X... .....X... ......X.. ......X..
.......X. .X....... .....X... .......X. ..X...... .......X. ..X...... ........X
.X....... .......X. ........X .....X... ........X .X....... .......X. .X.......
...X..... ....X.... .X....... ........X .X....... ....X.... .X....... ....X....
........X ........X ....X.... ..X...... .......X. ..X...... ....X.... .......X.
......X.. ...X..... ......X.. ....X.... ....X.... ........X ........X .....X...
....X.... .....X... ...X..... ......X.. ......X.. ......X.. .....X... ..X......
X........ X........ X........ X........ X........ X........ X........ X........
...X..... ....X.... ....X.... ....X.... ....X.... ....X.... ....X.... .....X...
.......X. .X....... ......X.. ......X.. ......X.. ........X ........X .X.......
..X...... .....X... .X....... ........X ........X .X....... .....X... ........X
........X ........X .....X... ..X...... ...X..... .....X... ...X..... ......X..
......X.. ..X...... ..X...... .......X. .X....... .......X. .X....... ...X.....
....X.... .......X. ........X .X....... .......X. ..X...... .......X. .......X.
.X....... ...X..... ...X..... ...X..... .....X... ......X.. ..X...... ..X......
.....X... ......X.. .......X. .....X... ..X...... ...X..... ......X.. ....X....
X........ X........ X........ X........ X........ X........ X........ X........
.....X... .....X... .....X... .....X... .....X... ......X.. ......X.. ......X..
...X..... ...X..... .......X. .......X. ........X ...X..... ...X..... ...X.....
.X....... .X....... ..X...... ....X.... ....X.... .....X... .......X. .......X.
......X.. .......X. ......X.. .X....... .X....... ........X ..X...... ..X......
........X ..X...... ...X..... ...X..... .......X. .X....... ....X.... ........X
..X...... ........X .X....... ........X ..X...... ....X.... ........X .....X...
....X.... ......X.. ........X ......X.. ......X.. ..X...... .X....... .X.......
.......X. ....X.... ....X.... ..X...... ...X..... .......X. .....X... ....X....
X........ X........ X........ X........ .X....... .X....... .X....... .X.......
......X.. .......X. .......X. .......X. ...X..... ...X..... ...X..... ...X.....
....X.... ...X..... ....X.... ....X.... X........ ......X.. .......X. ........X
.......X. .X....... ..X...... ..X...... ......X.. X........ ..X...... ......X..
.X....... ......X.. .....X... ........X ........X ..X...... ........X ..X......
........X ........X ........X ......X.. .....X... ........X .....X... X........
..X...... .....X... .X....... .X....... ..X...... .....X... X........ .....X...
.....X... ..X...... ...X..... ...X..... ....X.... .......X. ....X.... .......X.
...X..... ....X.... ......X.. .....X... .......X. ....X.... ......X.. ....X....
.X....... .X....... .X....... .X....... .X....... .X....... .X....... .X.......
...X..... ....X.... ....X.... ....X.... ....X.... ....X.... ....X.... ....X....
........X ......X.. ......X.. ......X.. ......X.. .......X. .......X. .......X.
......X.. X........ ...X..... ........X ........X X........ X........ .....X...
....X.... ..X...... X........ ..X...... ...X..... ..X...... ........X ........X
..X...... .......X. ..X...... .....X... .......X. .....X... .....X... ..X......
X........ .....X... ........X ...X..... X........ ........X ..X...... X........
.....X... ...X..... .....X... X........ ..X...... ......X.. ......X.. ...X.....
.......X. ........X .......X. .......X. .....X... ...X..... ...X..... ......X..
.X....... .X....... .X....... .X....... .X....... .X....... .X....... .X.......
....X.... ....X.... .....X... .....X... .....X... .....X... .....X... .....X...
.......X. ........X X........ X........ X........ X........ ..X...... ........X
.....X... ...X..... ..X...... ......X.. ......X.. ........X X........ ..X......
........X X........ ......X.. ...X..... ....X.... ....X.... .......X. ....X....
..X...... .......X. ........X .......X. ..X...... .......X. ...X..... .......X.
X........ .....X... ...X..... ..X...... ........X ...X..... ........X ...X.....
......X.. ..X...... .......X. ....X.... ...X..... ......X.. ......X.. X........
...X..... ......X.. ....X.... ........X .......X. ..X...... ....X.... ......X..
.X....... .X....... .X....... .X....... .X....... .X....... .X....... .X.......
......X.. ......X.. ......X.. .......X. .......X. .......X. ........X ........X
....X.... ....X.... ........X X........ ....X.... .....X... ....X.... .....X...
X........ .......X. .....X... ...X..... ..X...... ........X ..X...... ..X......
........X X........ ..X...... ......X.. ........X ..X...... .......X. ....X....
...X..... ...X..... X........ ........X .....X... X........ ...X..... .......X.
.....X... .....X... ...X..... .....X... ...X..... ...X..... ......X.. X........
.......X. ..X...... .......X. ..X...... X........ ......X.. X........ ...X.....
..X...... ........X ....X.... ....X.... ......X.. ....X.... .....X... ......X..
.X....... .X....... ..X...... ..X...... ..X...... ..X...... ..X...... ..X......
........X ........X X........ X........ X........ X........ X........ X........
.....X... .....X... ...X..... .....X... ......X.. ......X.. .......X. ........X
..X...... ...X..... ......X.. .......X. .X....... ....X.... ...X..... ......X..
......X.. ......X.. ........X ....X.... .......X. .......X. ........X ....X....
...X..... X........ .X....... .X....... .....X... .X....... ......X.. .X.......
X........ ..X...... ....X.... ...X..... ...X..... ...X..... ....X.... .......X.
.......X. ....X.... .......X. ........X ........X .....X... .X....... .....X...
....X.... .......X. .....X... ......X.. ....X.... ........X .....X... ...X.....
..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X......
....X.... ....X.... ....X.... ....X.... ....X.... ....X.... ....X.... .....X...
.X....... .X....... ......X.. .......X. .......X. ........X ........X .X.......
.......X. .......X. X........ .X....... .X....... .X....... ...X..... ......X..
X........ X........ ...X..... ........X ........X ...X..... X........ X........
...X..... ......X.. .X....... .....X... ......X.. ......X.. ......X.. ...X.....
......X.. ...X..... .......X. X........ X........ X........ .X....... .......X.
........X .....X... .....X... ......X.. ...X..... .......X. .....X... ....X....
.....X... ........X ........X ...X..... .....X... .....X... .......X. ........X
..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X......
.....X... .....X... .....X... .....X... .....X... .....X... .....X... .....X...
.X....... .......X. .......X. .......X. .......X. .......X. ........X ........X
........X X........ X........ .X....... ....X.... ....X.... X........ .X.......
....X.... ...X..... ....X.... ...X..... X........ .X....... .......X. ....X....
X........ ......X.. ........X ........X ........X ........X ...X..... ......X..
.......X. ....X.... .X....... ......X.. ......X.. ......X.. .X....... ...X.....
...X..... .X....... ...X..... ....X.... .X....... ...X..... ......X.. X........
......X.. ........X ......X.. X........ ...X..... X........ ....X.... .......X.
..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X......
.....X... .....X... .....X... .....X... .....X... ......X.. ......X.. ......X..
........X ........X ........X ........X ........X .X....... .X....... .X.......
.X....... ....X.... ......X.. ......X.. ......X.. ...X..... .......X. .......X.
.......X. .......X. X........ .X....... ...X..... .......X. ....X.... .....X...
X........ X........ ...X..... ...X..... X........ X........ ........X ...X.....
...X..... ...X..... .X....... .......X. .......X. ....X.... X........ X........
......X.. .X....... ....X.... X........ .X....... ........X .....X... ....X....
....X.... ......X.. .......X. ....X.... ....X.... .....X... ...X..... ........X
..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X......
......X.. ......X.. ......X.. ......X.. ......X.. .......X. .......X. .......X.
...X..... ...X..... ...X..... ........X ........X .X....... ...X..... .....X...
.X....... .X....... .......X. X........ ...X..... ...X..... ......X.. X........
........X ........X ....X.... ....X.... .X....... ........X ........X ........X
....X.... .....X... ........X .X....... ....X.... ......X.. .X....... .X.......
X........ X........ X........ .......X. .......X. ....X.... ....X.... ....X....
.......X. ....X.... .....X... .....X... .....X... X........ X........ ......X..
.....X... .......X. .X....... ...X..... X........ .....X... .....X... ...X.....
..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X...... ..X......
.......X. .......X. ........X ........X ........X ........X ........X ........X
.....X... .....X... .X....... ...X..... ...X..... ...X..... .....X... .....X...
...X..... ........X ....X.... X........ .X....... .......X. .X....... ...X.....
........X .X....... .......X. .......X. .......X. ....X.... ....X.... X........
X........ ....X.... X........ .....X... .....X... .X....... ......X.. ......X..
....X.... X........ ......X.. .X....... X........ .....X... X........ ....X....
......X.. ...X..... ...X..... ......X.. ......X.. X........ ...X..... .X.......
.X....... ......X.. .....X... ....X.... ....X.... ......X.. .......X. .......X.
..X...... ...X..... ...X..... ...X..... ...X..... ...X..... ...X..... ...X.....
........X X........ X........ X........ X........ X........ X........ .X.......
.....X... ..X...... ....X.... ....X.... ....X.... ......X.. ........X ....X....
.......X. .....X... .X....... .......X. ........X ........X .....X... .......X.
.X....... ........X ........X .X....... .X....... .X....... ..X...... X........
...X..... .X....... ......X.. ......X.. .....X... .....X... ......X.. ..X......
X........ .......X. ..X...... ..X...... .......X. .......X. .X....... .....X...
......X.. ....X.... .......X. .....X... ..X...... ..X...... .......X. ........X
....X.... ......X.. .....X... ........X ......X.. ....X.... ....X.... ......X..
...X..... ...X..... ...X..... ...X..... ...X..... ...X..... ...X..... ...X.....
.X....... .X....... .X....... .X....... .X....... .X....... .....X... .....X...
......X.. ......X.. ......X.. .......X. ........X ........X X........ X........
..X...... ........X ........X ..X...... ..X...... ....X.... ....X.... ........X
X........ X........ X........ ........X .....X... X........ .X....... ....X....
.......X. ....X.... .......X. ......X.. .......X. .......X. .......X. .......X.
....X.... .......X. ....X.... ....X.... X........ .....X... ..X...... .X.......
........X .....X... ..X...... X........ ....X.... ..X...... ......X.. ......X..
.....X... ..X...... .....X... .....X... ......X.. ......X.. ........X ..X......
...X..... ...X..... ...X..... ...X..... ...X..... ...X..... ...X..... ...X.....
.....X... .....X... .....X... .....X... .....X... .....X... .....X... .....X...
X........ ..X...... ..X...... ..X...... .......X. .......X. .......X. .......X.
........X ........X ........X ........X .X....... .X....... .X....... ..X......
......X.. .X....... .X....... ......X.. ....X.... ....X.... ......X.. X........
..X...... ....X.... .......X. X........ X........ ......X.. X........ ......X..
.......X. .......X. ....X.... .......X. ........X ........X ..X...... ....X....
.X....... X........ ......X.. .X....... ......X.. X........ ....X.... .X.......
....X.... ......X.. X........ ....X.... ..X...... ..X...... ........X ........X
... to be continued ...