// nQueen.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using namespace std;
class Queen
{
friend int nQueen();
public:
bool Place(int k);
void Backtrack(void);
int n;//皇后的个数
int *x;//当前解
long sum;//当前找到的可行发案数
} ;
bool Queen::Place(int k)
{
for(int j=1;j<k;j++)
{
if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false;
}
return true;
}
void Queen::Backtrack(void)
{
x[1]=0;
int k=1;
while(k>0)
{
x[k]+=1;
while((x[k]<=n)&&!(Place(k))) x[k]+=1;
if(x[k]<=n)
if(k==n)
{
sum++;
for(int i=1;i<=n;i++)cout<<x[i];
cout<<endl;
}
else
{
k++;
x[k]=0;
}
else k--;
}
}
int nQueen(int n)
{
Queen X;
//初始化 X
X.n=n;
X.sum=0;
int *p = new int[n+1];
for(int i=0;i<=n;i++) p[i]=0;
X.x=p;
X.Backtrack();
delete p;
return X.sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
int n,sum;
cout<<"请输入n皇后的个数: "<<endl;
cin>>n;
sum=nQueen(n);
cout<<"总共有"<<sum<<"种可行方案"<<endl;
return 0;
}