搜索:N皇后

N皇后问题是DFS的代表性问题,其最难的地方就是在判重这里,想明白了怎么判重的话问题就很显然了。

这里给出两份代码,其中第一份代码的效率更好,就是在判重上下了功夫。当然,我记得还有使用位运算进行判重的方法,这里就先不介绍了。

首先是第一份代码,二维数组直接进行判重。

 1 #include<iostream>
 2 using namespace std;
 3 int n,ans=0;
 4 int a[1005],v[5][1005];
 5 void dfs(int dp)
 6 {
 7     if(dp>n)
 8     {
 9         ans++;
10         return;
11     }
12     for(int i=0;i<n;i++)
13     if(!v[0][i]&&!v[1][dp+i]&&!v[2][dp-i+n])
14     {
15         v[0][i]=v[1][dp+i]=v[2][dp-i+n]=1;
16         dfs(dp+1);
17         v[0][i]=v[1][dp+i]=v[2][dp-i+n]=0;
18     }
19 }
20 int main()
21 {
22     cin>>n;
23     dfs(1);
24     cout<<ans;
25     return 0;
26 }

第二份代码的判重思路还是很容易看懂的,只不过效率不如第一份代码的好。

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=15;
 6 int n;
 7 int ans=0; 
 8 int c[maxn];
 9 bool check(int x)
10 {
11     for(int i=1;i<x;i++)
12     {
13         if(c[x]==c[i]||x-c[x]==i-c[i]||x+c[x]==i+c[i])
14             return false;            
15     }
16     return true;
17 }
18 void dfs(int dp)
19 {
20     if(dp>n)
21     {
22         ans++;
23         return;
24     }
25     for(int i=1;i<=n;i++)
26     {
27         c[dp]=i;
28         if(check(dp))
29             dfs(dp+1);
30         c[dp]=0;
31     }
32 }
33 int main()
34 {
35     cin>>n;
36     dfs(1);
37     cout<<ans<<endl;
38     return 0;
39 } 

 

posted @ 2018-07-07 18:43  静听风吟。  阅读(130)  评论(0编辑  收藏  举报