首页 > 其他 > 详细

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

时间:2017-03-04 10:39:54      阅读:179      评论:0      收藏:0      [点我收藏+]
 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

技术分享

 

 

 

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

原文:http://www.cnblogs.com/Elaine-DWL/p/6500427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!