/*
用递归实现回溯法求解n皇后问题
最初调用时 k=1,flag=false
*/
void CBacktrack::n_queens_rcv(int x[], int k, bool &flag, int n) //flag必须为引用参数,否则得不到正确结果
{
while((x[k]<=n) && (!flag) && (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)
{
flag=true;
break;
}
else
n_queens_rcv(x,k+1,flag,n);
}
else //当前层没有满足条件的,退到上一层
{
x[k]=0;
k=k-1;
}
}
}
void main()
{
/////////////////////////////////////////////
//////// 回溯法求解n皇后问题 ////////////
int x[5]={0}; //x[1......5-1]
int n=4;
bool fg=false;
CBacktrack m_Backtrack;
m_Backtrack.n_queens_rcv(x,1,fg,n);
for(int i=1;i<=n;i++)
cout<<x[i]<<" ";
getchar();
return 0;
}