bool CBacktrack::place(int x[], int k)
{
int i=0;
for(i=1;i<k;i++)
{
if((x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k)))
return false;
}
return true;
}
/*
用回溯法求解n皇后问题
调用place()作为判决条件
*/
void CBacktrack::n_queens(int x[], int n)
{
int k=1;
x[1]=0;
while(k>0)
{
x[k]=x[k]+1;
while((x[k]<=n) && (!place(x,k))) //不满足条件,在允许范围内继续搜索
x[k]=x[k]+1;
if(x[k]<=n) //找到了满足当前条件的
{
if(k==n)
break;
else
{
k=k+1;
x[k]=0;
}
}
else //当前层没有满足条件的,退到上一层
{
x[k]=0;
k=k-1;
}
}
}
void main()
{
/////////////////////////////////////////////
//////// 回溯法求解n皇后问题 ////////////
int x[5]={0}; //x[1......5-1]
int n=4;
CBacktrack m_Backtrack;
m_Backtrack.n_queens(x,n);
for(int i=1;i<=n;i++)
cout<<x[i]<<" ";
getchar();
return 0;
}