zoukankan      html  css  js  c++  java
  • HDU 2553(N皇后)(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553

    i表示行,map[i]表示列,然后用DFS遍历回溯

    可以参考这篇文章:

    http://blog.csdn.net/cambridgeacm/article/details/7703739

     1 #include <iostream>
     2 #include <string>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <stack>
     9 using namespace std;
    10 
    11 #define MEM(a,b) memset(a,b,sizeof(a))
    12 
    13 bool used[15];
    14 //i表示行,map[i]表示列
    15 int map[15];
    16 int sol[15];
    17 
    18 int ans,n;
    19 
    20 
    21 void dfs(int k)
    22 {
    23           int i,j;
    24 
    25           //判断末尾
    26           if(k==n+1)
    27           {
    28                     ans++;
    29                     return;
    30           }
    31 
    32           for(i = 1;i<=n;i++)
    33           {
    34                     if(!used[i])
    35                     {
    36                               map[k] = i;
    37                               bool flag = true;
    38 
    39                               //是否在一条斜线上
    40                               for(j=1;j<=k-1;j++)
    41                               {
    42                                         if((map[k]-map[j])==(k-j) || (map[k]-map[j])==(j-k))
    43                                         {
    44                                                  flag = false;
    45                                                  break;
    46                                         }
    47                               }
    48                               if(flag)
    49                               {
    50                                         used[i] = true;
    51                                         dfs(k+1);
    52                                         //没找到,释放used
    53                                         //回溯
    54                                         used[i] = false;
    55                               }
    56                     }
    57           }
    58 }
    59 
    60 
    61 int main()
    62 {
    63           int t,i;
    64           //保存是因为后台可能有重复的数据,单次来说效率是一样的
    65           for(i = 1;i<=10;i++)
    66           {
    67                     MEM(used,false);
    68         MEM(map,0);
    69         n = i;
    70         ans = 0;
    71         dfs(1);
    72         sol[i] = ans;
    73           }
    74 
    75     while (~scanf("%d",&n) && n)
    76     {
    77                     printf("%d
    ",sol[n]);
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    (五)消费Dubbo服务
    (四)Dubbo Admin管理控制台
    (三)发布Dubbo服务
    (二)zookeeper安装
    (一)Dubbo简介
    解决tomcat 启动 一闪而过
    Redis的数据结构之哈希
    Redis的数据结构之字符串
    Jedis 连接池实例
    linux/centos定时任务cron
  • 原文地址:https://www.cnblogs.com/qlky/p/5020872.html
Copyright © 2011-2022 走看看