Algorithm N皇后算法
上面的代码是用于使用回溯解决N皇后问题的。我认为它可以将两行中的前两个皇后放在各自的列中,然后当涉及到第三行皇后时,它不能被放置,因为没有皇后需要进行攻击,它将简单地退出算法N皇后…那么这个算法是如何实现的呢回溯?这里的秘密是递归 让下面的每个缩进级别表示递归级别 (实际情况并非如此,因为第三位女王很容易被安置,但这需要更多的写作和/或思考才能得出一个实际失败的案例) 更符合代码实际功能的内容:(仍然不是实际发生的情况)Algorithm N皇后算法,algorithm,recursion,backtracking,n-queens,Algorithm,Recursion,Backtracking,N Queens,上面的代码是用于使用回溯解决N皇后问题的。我认为它可以将两行中的前两个皇后放在各自的列中,然后当涉及到第三行皇后时,它不能被放置,因为没有皇后需要进行攻击,它将简单地退出算法N皇后…那么这个算法是如何实现的呢回溯?这里的秘密是递归 让下面的每个缩进级别表示递归级别 (实际情况并非如此,因为第三位女王很容易被安置,但这需要更多的写作和/或思考才能得出一个实际失败的案例) 更符合代码实际功能的内容:(仍然不是实际发生的情况) 我希望这能有所帮助。我有代码,但不使用回溯,但好的是,它给了时间复杂度大哦
我希望这能有所帮助。我有代码,但不使用回溯,但好的是,它给了时间复杂度大哦(n)
//当n为偶数时。。。
对于(j=1;j公共类问题{
公共静态布尔isSafe(整块板[][],整块行,整块列){
int n=电路板长度;
//检查垂直线
对于(int i=0;i=0&&j=0&&j>=0;i--,j--){
如果(board[i][j]==1)返回false;
}
//检查西南部
对于(int i=row+1,j=col-1;i=0;i++,j--){
如果(board[i][j]==1)返回false;
}
返回true;
}
公共静态布尔n队列(int板[][],int行){
if(row==board.length)返回true;
对于(int j=0;j
在这里,我们使用回溯。回溯背后的思想是:我们走一条通向解决方案的道路,在不同的决策点上做出选择,如果我们走到了死胡同(没有更多的决策点,我们还没有找到我们要找的解决方案),我们回溯——也就是说,回到我们做出决定的最后一点,然后做出不同的选择(如果还有剩余的话)
public class-nqueen
{
//返回为n皇后问题找到的解决方案数。
公共静态整数求解(整数n)
{
//我们将在每列中放置一个皇后。皇后[i]将指示
//“i”列中的皇后占据了。
int[]queens=新的int[n];
//用于跟踪哪些行、对角线、,
//对对角线已经被女王统治了
boolean[]used_rows=新的boolean[n];
boolean[]md=new boolean[2*n];//主对角线:\\\
boolean[]cd=new boolean[2*n];//对角:///
返回解算(皇后区、已用行、md、cd、0);
}
私有静态int solve(int[]queens,boolean[]used_行,boolean[]md,boolean[]cd,int col)
{
//找到了解决方案!请打印出来
如果(列==皇后长度)
{
打印解决方案(皇后区);
返回1;
}
//跟踪找到的解决方案的数量
整数计数=0;
/考虑把女王放在每一行。
for(int row=0;rowAlgorithm 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;
if ( k = n) then write ( x [1 : n]
else NQueens ( k+1, n);
}
}
}
Algorithm Place (k, i)
{
for j := 1 to k-1 do
if (( x[ j ] = // in the same column
or (Abs( x [ j ] - i) =Abs ( j – k ))) // or in the same diagonal
then return false;
return true;
}
try to place first queen
success
try to place second queen
success
try to place third queen
fail
try to place second queen in another position
success
try to place third queen
success
try to place fourth queen
first queen
i = 1
Can place? Yes. Cool, recurse.
second queen
i = 1
Can place? No.
i = 2
Can place? No.
i = 3
Can place? Yes. Cool, recurse.
third queen
i = 1
Can place? No.
i = 2
Can place? No.
... (can be placed at no position)
fail
back to second queen
i = 4
Can place? Yes. Cool, recurse.
third queen
i = 1
Can place? No.
...
// when n is even...
for(j=1;j<=n/2;j++)
{
x[j]=2*j;
};
i=1;
for(j=n/2 +1 ;j<=n;j++)
{
x[j] =i;
i=(2*i)+1;
}
// when n is odd..
i=0;
for(j=1;j<=(n/2+1);j++)
{
x[i] = (2*i)+1;
i++;
}
i=1;
for(j=(n/2+2);j<=n;j++)
{
x[j] = 2*i;
i++;
}
public class Problem {
public static boolean isSafe(int board[][], int row, int col) {
int n = board.length;
//check vertical line
for(int i=0; i < board.length; i++) {
if(i == row) continue;
if(board[i][col] == 1) return false;
}
//check horizontal line
for(int j=0; j < n; j++) {
if(j == col) continue;
if(board[row][j] == 1) return false;
}
//check north east
for(int i=row-1, j=col+1; i >=0 && j < n; i--, j++) {
if(board[i][j] == 1) return false;
}
//check south east
for(int i=row+1, j=col+1; i < n && j < n; i++, j++) {
if(board[i][j] == 1) return false;
}
//check north west
for(int i=row-1, j=col-1; i >=0 && j >=0; i--,j--) {
if(board[i][j] == 1) return false;
}
//check south west
for(int i=row+1, j=col-1; i<n && j >=0; i++,j--) {
if(board[i][j] == 1) return false;
}
return true;
}
public static boolean nQueen(int board[][], int row) {
if(row == board.length) return true;
for(int j=0; j < board.length; j++) {
if(isSafe(board, row, j)) {
board[row][j] = 1;
boolean nextPlacement = nQueen(board, row + 1);
if(nextPlacement) return true;
board[row][j] = 0;
}
}
return false;
}
public static void displayResult(int board[][]) {
int n = board.length;
for(int i=0; i < n; i++) {
for(int j=0; j < n; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
public static void util(int board[][]) {
int n = board.length;
boolean result = nQueen(board, 0);
if(result) {
System.out.println(n + " queens can be placed in following arragement");
displayResult(board);
}
else {
System.out.println("Not possible to place " + n + " queens in " + n + " X " + n + " board");
}
System.out.println();
}
public static void main(String[] args) {
util(new int[3][3]);
util(new int[4][4]);
util(new int[2][2]);
util(new int[5][5]);
util(new int[8][8]);
util(new int[16][16]);
}
}
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()
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 ...