using
System;
using
System.Text;
class
Program {
static
bool
[, ] board =
new
bool
[8, 8];
const
int
N = 8, M = 8;
static
int
minCount =
int
.MaxValue;
static
string
layout;
static
void
StoreLayout()
{
StringBuilder sb =
new
StringBuilder();
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j < M; j++) {
sb.Append(board[i, j] ?
"Q "
:
"X "
);
}
sb.Append(
"\n"
);
}
layout = sb.ToString();
}
static
bool
IsAttacked(
int
row,
int
col)
{
int
i, j;
for
(i = 0; i < N; ++i) {
if
(board[i, col])
return
true
;
}
for
(j = 0; j < M; ++j) {
if
(board[row, j])
return
true
;
}
for
(i = 0; i < Math.Min(N, M); ++i) {
if
(row - i >= 0 && col - i >= 0
&& board[row - i, col - i])
return
true
;
else
if
(row - i >= 0 && col + i < M
&& board[row - i, col + i])
return
true
;
else
if
(row + i < N && col - i >= 0
&& board[row + i, col - i])
return
true
;
else
if
(row + i < N && col + i < M
&& board[row + i, col + i])
return
true
;
}
return
false
;
}
static
void
PlaceQueen(
int
countSoFar)
{
int
i, j;
if
(countSoFar >= minCount)
return
;
bool
flag =
false
;
while
(!flag) {
for
(i = 0; i < N; ++i) {
for
(j = 0; j < M; ++j) {
if
(!IsAttacked(i, j)) {
i = N;
flag =
true
;
break
;
}
}
if
(flag)
break
;
}
if
(flag)
break
;
minCount = countSoFar;
StoreLayout();
break
;
}
for
(i = 0; i < N; ++i) {
for
(j = 0; j < M; ++j) {
if
(!IsAttacked(i, j)) {
board[i, j] =
true
;
PlaceQueen(countSoFar + 1);
board[i, j] =
false
;
}
}
}
}
static
void
Main()
{
Array.Clear(board, 0, board.Length);
PlaceQueen(0);
Console.WriteLine(minCount);
Console.WriteLine(
"\nLayout: \n"
+ layout);
}
}