关键问题:不在同行,同列,斜线上。即对任意两行,!(x[r1]==x[r] || abs(r1-r)==abs(x[r1]-x[r]))。用回溯法,通过此条件进行减枝。
#include <iostream>
using namespace std;
void print(int *x, int n)
{
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(x[i]==j)
cout<<"1"<<" ";
else
cout<<"0"<<" ";
}
cout<<endl;
}
cout<<endl;
}
bool place(int r, int *x)
{
for(int r1=0; r1<r; r1++)
{
if(x[r1]==x[r] || abs(r1-r)==abs(x[r1]-x[r]))
return false;
}
return true;
}
void backtrack(int r, int* x, int n)
{
if(r==n)
{
print(x, n);
return ;
}
for(int i=0 ;i<n; i++)
{
x[r] = i;
if(place(r, x))
backtrack(r+1, x, n);
}
}
void nQueen(int n)
{
if(n<4)
cout<<"n should be larger than 3."<<endl;
int *x = new int[n];
int i;
for(i=0; i<n; i++)
x[n] = 0;
backtrack(0, x, n);
}
int main()
{
nQueen(4);
return 0;
}