經典回溯問題--八皇后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("\n");
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種解法\n",ans);
43     return 0;
44 }
用a[i]=j表示第i行的第j列放置皇后,最后a[]則表示所有皇后的放置
運行結果:

。。。。省略幾張(不想截QAQ

 

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM