//递归:八皇后 92种解
#include<iostream>
using namespace std;
#define N 8//8 queens
#define N2 15//15 diagonals
static char Queen[N][N];
static int col[N];
static int mainDiag[N2];
static int subDiag[N2];
int solution;
void DrawBoard(char Queen[][N])
{
for (int m = 0; m<N; m++)
{
for(int n = 0; n<N; n++)
cout<<Queen[m][n]<<" ";
cout<<endl;
}
cout<<endl;
}
void PlaceQueen(int i)// i = row
{
int j; //column
for ( j = 0; j<N; j++ )
{
if( col[j]==0 && mainDiag[i - j + 7]==0 && subDiag[i + j]==0 )//no intrusion
{
Queen[i][j] = '#'; //place a queen
col[j] = 1; // reject another queen in this column
mainDiag[i - j + 7] = 1;
subDiag[ i + j] = 1;
if( i<7 )
PlaceQueen(i + 1);
else//N queens placed done! Print result
{
cout<<"Solution "<<++solution<<endl;
DrawBoard(Queen);
}
//if cannot place another queen, reset col, mainDiag, subDiag status
Queen[i][j] = '_';
col[j] = 0; // reject another queen in this column
mainDiag[i - j + 7] = 0;
subDiag[ i + j] = 0;
}
}
}
void main()
{
//Initialize chessboard
int i, j;
for (i = 0; i<N; i++)
{
col[i] = 0;
for ( j = 0; j<N; j++)
Queen[i][j] = '_';
}
for ( i = 0; i<N2; i++ )
mainDiag[i] = subDiag[i] = 0;//0 stands for no intrusion
PlaceQueen(0);
cout<<solution<<" solutions.\n";
}
//Result 92 solutions