```cpp
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=11;
int n,P[maxn],hashTable[maxn]={0};
//P为当前排列,hashTable记录整数x是否已在P中
//当前处理的事排列的第index位
void generateP(int index)
{
if(index==n+1) //递归边界 此时已经处理完1-N位
{
for(int i=1;i<=n;i++)
{
cout<<P[i]; //输出当前排列
}
cout<<endl;
return ;
}
for(int x=1;x<=n;x++) //枚举1-n 试图将x填入P[index]
{
if(hashTable[x]==0) //如果x不在P[0]-P[index-1]中
{
P[index]=x; //令P的第ind位为x,即把x加入当前排序
hashTable[x]=1; //记x已在P中
generateP(index+1); //处理排列的第index+1位
hashTable[x]=0; //已处理完P[index]为x的子问题 还原状态
}
}
}
```cpp
int main()
{
n=3; //输出1-3的全排列
generateP(1); //从1开始填
return 0;
}
上面就是全排列的实现。N皇后本质上就是一个全排列的问题
比如实现5皇后 a[1]-a[5]分别表示第一行到第五行,a[i]中的数表示这一行的皇后位于第几列,则N皇后就成了下列问题:
求出N的全排列,且任意两个数不得满足abs(i-j)==abs(P[i]-P[j]) (任意两个皇后不得在同一对角线上)
#include<iostream>
#include<cstdio>
using namespace std;
int count=0;
const int maxn=11;
int n,P[maxn],hashTable[maxn]={0};
void generateP(int index){
if(index==n+1){
bool flag=true;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(abs(i-j)==abs(P[i]-P[j])) //在同一对角线上 ,则不合法
flag=false;
}
}
if(flag) count++; //合法,count++
return;
}
for(int x=1;x<=n;x++)
{
if(hashTable[x]==0)
{
P[index]=x;
hashTable[x]=1;
generateP(index+1);
hashTable[x]=0;
}
}
}
int main()
{
n=8;
generateP(1);
cout<<count;
return 0;
}
输出位92 8皇后的问题答案是92.