经典回溯问题--八皇后dfs递归回溯求解【DFS】

 1 //N皇后问题 
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 #define N 8//皇后个数 
 8 int ans=0;
 9 int a[N]={0};//a[i]=j表示在第i行的第j列放置 
10 bool check0(int i,int j,int a_i,int a_j){//判断两个位置是否相邻,相邻则返回true ,因为是按行排列的  所以不用考虑同行的情况
11     if(a_i==a_j) return true;//放在同一列
12     if(fabs(j-i)==fabs(a_i-a_j)) return true;//放在同对角线(主对角线or次对角线)
13     return false; 
14 }
15 bool check(int i,int j){//判断a[i]=j是否不和前面几行冲突 
16     for(int k=0;k<i;k++){
17         if(check0(k,i,a[k],j))
18         return true;
19     }
20     return false;//不冲突 可以放 
21 }
22 void dfs(int n){//确定第n行应填的位置 
23     if(n==N) {
24         ans++;
25         printf("a[]: ");
26         for(int i=0;i<N;i++){
27             printf("%d ",a[i]);
28         }
29         printf("
");
30         return;
31     }
32     for(int i=0;i<N;i++){//从第0列开始试探
33         a[n]=i;//假设放在第i列 
34         if(check(n,i)) continue;
35         dfs(n+1);
36         
37         
38     }
39 }
40 int main(){
41     dfs(0);
42     printf("共有%d种解法
",ans);
43     return 0;
44 }
用a[i]=j表示第i行的第j列放置皇后,最后a[]则表示所有皇后的放置
运行结果:

。。。。省略几张(不想截QAQ


原文地址:https://www.cnblogs.com/Elaine-DWL/p/6500427.html