八皇后问题

 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 }

 

posted @ 2019-04-17 16:27  M_x_j  阅读(190)  评论(0编辑  收藏  举报