PHP Code:
#include <iostream>
using namespace std;
struct Square
{
char Queen;
int BlackEnemies;
int WhiteEnemies;
};
void AllocBoard(Square ** & board, int & n);
void DelBoard(Square ** & board, int n);
void ShowBoard(Square ** board, int n);
void AddEnemies(Square ** & board, int n, char chess_piece, int row, int column);
void ReduceEnemies(Square ** & board, int n, char chess_piece, int row, int column);
int ArrangeQueen(Square ** & board, int n, int black, int white);
void Release(Square ** & board, int n, int black, int white, int max);
int main()
{
Square ** board;
int n, max;
AllocBoard(board, n);
max = ArrangeQueen(board, n, 0, 0);
cout << "kmax is: " << max;
cout << endl;
Release(board, n, 0, 0, max);
DelBoard(board, n);
return 0;
}
void AllocBoard(Square ** & board, int & n)
{
cout << "Enter the size of the chess-board: ";
cin >> n;
// Allocate
board = new Square * [n];
for (int i = 0; i < n; ++i)
{
board[i] = new Square [n];
}
// Initialize
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
board[i][j].Queen = '*';
board[i][j].WhiteEnemies = 0;
board[i][j].BlackEnemies = 0;
}
}
}
void DelBoard(Square ** & board, int n)
{
for (int i = 0; i < n; ++i)
{
delete [] board[i];
}
delete [] board;
}
void ShowBoard(Square ** board, int n)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << board[i][j].Queen << " ";
}
cout << endl;
}
}
void AddEnemies(Square ** & board, int n, char chess_piece, int row, int column)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (row == i || column == j || row - column == i - j || row + column == i + j)
{
if ('W' == chess_piece)
{
++board[i][j].WhiteEnemies;
}
else
{
++board[i][j].BlackEnemies;
}
}
}
}
}
void ReduceEnemies(Square ** & board, int n, char chess_piece, int row, int column)
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (row == i || column == j || row - column == i - j || row + column == i + j)
{
if ('W' == chess_piece)
{
--board[i][j].WhiteEnemies;
}
else
{
--board[i][j].BlackEnemies;
}
}
}
}
}
int ArrangeQueen(Square ** & board, int n, int black, int white)
{
static int max = 0;
if (black == white && max < black)
{
max = black;
}
else
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (0 == board[i][j].WhiteEnemies && '*' == board[i][j].Queen)
{
board[i][j].Queen = 'B';
AddEnemies(board, n, 'B', i, j);
ArrangeQueen(board, n, black + 1, white);
ReduceEnemies(board, n, 'B', i, j);
board[i][j].Queen = '*';
}
if (0 == board[i][j].BlackEnemies && '*' == board[i][j].Queen)
{
board[i][j].Queen = 'W';
AddEnemies(board, n, 'W', i, j);
ArrangeQueen(board, n, black, white + 1);
ReduceEnemies(board, n, 'W', i, j);
board[i][j].Queen = '*';
}
}
}
}
return
max;
}
void Release(Square ** & board, int n, int black, int white, int max)
{
if (black == white && max == white)
{
cout << endl;
ShowBoard(board, n);
cout << endl;
}
else
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
if (0 == board[i][j].WhiteEnemies && '*' == board[i][j].Queen)
{
board[i][j].Queen = 'B';
AddEnemies(board, n, 'B', i, j);
ArrangeQueen(board, n, black + 1, white);
ReduceEnemies(board, n, 'B', i, j);
board[i][j].Queen = '*';
}
if (0 == board[i][j].BlackEnemies && '*' == board[i][j].Queen)
{
board[i][j].Queen = 'W';
AddEnemies(board, n, 'W', i, j);
ArrangeQueen(board, n, black, white + 1);
ReduceEnemies(board, n, 'W', i, j);
board[i][j].Queen = '*';
}
}
}
}
}

