//
// main.cpp
// 回溯皇后问题
#include <iostream>
#include <algorithm>
using namespace std;
int x[100];
//算法1
bool place(int x[], int k)
{
int i;//代表前面所有的q皇后,k代表新来的皇后
for(i=1; i<k; i++)
{
if((x[i]==x[k])||(abs(x[i]-x[k])==abs(i-k)))
return false;
}
return true;
}
int nqueens(int x[],int n)
{
int k=1; x[1]=0;
int ans=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) {for(int j=1;j<=n;j++) cout<<x[j]<<" "; cout<<endl; ans++; continue;}//终结
else {k=k+1;x[k]=0;}//下一层
}
else{x[k]=0;k=k-1;}//返回上一层
}
return ans;
}
int main(int argc, char * argv[]) {
int n;
fill(x, x+100, 0);
cout <<"please input n:"<<endl;
cin >> n;
cout << nqueens(x, n)<<endl;;
return 0;
}