• 搜索: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 } 
  • 相关阅读:
    labview dll 崩溃
    java方法01什么是方法?
    java控制流程控制10增强For循环
    Java方法05可变参数
    java流程控制09打印九九乘法表
    Java流程控制12打印三角形及DUG
    Java方法02方法的定义和调用
    Java流程控制08For循环详解
    java流程控制11break、continue、goto
    java方法04命令行传递参数
  • 原文地址:https://www.cnblogs.com/aininot260/p/9278072.html
Copyright © 2020-2023  润新知