#include <stdio.h>
#include <math.h>
const int max_n=11;
int n,//问题规模(皇后个数)
place[max_n],//用来存放当前排列(第1、2、3…列的皇后所在的行)
hashTable[max_n]={false};//用来存放第i行是否已经放置了皇后
int cnt=0;//满足条件的情况总数
void generateP(int i){//为第i列分配皇后
if(i==n+1){
cnt++;//找到一种可能情况
return;
}
for(int j=1;j<=n;j++){//尝试每行
if(hashTable[j]==false){//该行上目前没有皇后
bool flag=true;//是否满足放置条件
for(int k=1;k<i;k++){//检查放置在该位置是否会与其他皇后冲突
if(abs(i-k)==abs(j-place[k])){
flag=false;
break;
}
}
if(flag){
place[i]=j;//确定该列皇后位置
hashTable[j]=true;//标明占用该行
generateP(i+1);//进入下一层递归
hashTable[j]=false;//回到该层时解除占用
}
}
}
}
int main(){
n=8;//n皇后问题
generateP(1);
printf("cnt = %d",cnt);
return 0;
}
运行效果: