zoukankan      html  css  js  c++  java
  • 搜索: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 } 
  • 相关阅读:
    EF框架 处理decimal字段 Sum() 遇到NULL时的特殊处理
    RSA加密解密及RSA签名和验证
    SQL 类似switch的东东用法
    js抛物线动画
    MyBatis的结果映射(resultMap)
    mybatis中#和$符号的区别
    MyBatis 中Mapper.xml中注意事项
    MyBatis sql映射器 Mapper
    MyBatis的自定义别名和内置别名
    MyBatis简单认识(入门)
  • 原文地址:https://www.cnblogs.com/aininot260/p/9278072.html
Copyright © 2011-2022 走看看