1 //八皇后递归解法
2 #include<iostream>
3 using namespace std;
4 int queen[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
5 int count=0;
6 bool available(int pointi,int pointj){//判断某个皇后是否与已有皇后冲突
7 for(int i=1;i<pointi;i++){
8 if(pointj==queen[i])return false;//同一列拒绝
9 if((pointi-i)==(pointj-queen[i]))return false;//同一主对角线拒绝
10 if((pointi-i)+(pointj-queen[i])==0)return false;//同一副对角线拒绝
11 }
12 return true;
13 }
14 void findSpace(int queenNumber){//在第queenNumber行找能放皇后的位置
15 for(int i=1;i<9;i++){//从1~8遍历这一行的八个空位
16 if(available(queenNumber,i)){
17 //如果可以放这个位置就记录下第queenNumber个皇后的位置
18 queen[queenNumber]=i;
19 if(queenNumber==8){//如果八个皇后都放满了统计一下
20 count++;
21 return;
22 }
23 int nextNumber=queenNumber+1;//还有皇后没放递归放下一个皇后
24 findSpace(nextNumber);
25 }
26 }
27 queen[--queenNumber]=-1;//如果这一行没有可放的位置说明上一行皇后放的位置不行,要为上一个皇后寻找新的可放位置
28 return;
29 }
30 int main(){
31 findSpace(1);//从(1,1)开始递归
32 cout<<count<<endl;
33 return 0;
34 }