在一个8*8的棋盘上  放置八个皇后 , 使得他们互相不攻击(皇后攻击范围为 同行同列同对角线) ,

方法一 :

从64个格子中 选一个子集 , 使得 " 子集 中恰好有八个元素 , 且任意选出的两个格子都不是同一行,同一列同,一对角线"  , 这是子集枚举问题 , 然而 , 64个格子的自己有2^64个   ,   所需处理数据过大 !

方法二: 

从64个格子中 选八个格子 , 称为组合生成问题 , 根据组合数学 有 4.426*10^9中方案 , 虽然比第一种好 , 但是然并卵 .

---------------------------我是分割线--------------------------------------

经过思考你会不难发现下面一种方法 , 每一行每一列恰好会放一个皇后 , 所以可以从第一行开始放 , 然后考虑第二行 , 依次进行 下去 !

这样就变成了全排列生成问题 , 这样的排列有 8! = 40320个 , 枚举量不会超过该数字

然而 如果每次都枚举这么多次的话   也会超时的 , 所以我们可以采用回溯的方法   或者 用   上/下一个排列 .

  1. // 这是一种很常用的方法 ,平时的搜索 都是这 一种形式
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9. #include<map>
  10. #include<set>
  11. #include<stack>
  12. using namespace std;
  13. int tot,c[],vis[][],n,a[];
  14. void search(int cur)
  15. {
  16. if(cur==n)
  17. tot++;
  18. else
  19. for(int i=;i<n;i++)
  20. {
  21. if(!vis[][i]&&!vis[][cur+i]&&!vis[][cur-i+n])
  22. {
  23. c[cur]=i;
  24. vis[][i]=vis[][cur+i]=vis[][cur-i+n]=;
  25. search(cur+);
  26. vis[][i]=vis[][cur+i]=vis[][cur-i+n]=;
  27. }
  28. }
  29. }
  30. int main()
  31. {
  32. for(n=;n<=;n++)
  33. {
  34. tot=;
  35. memset(c,,sizeof(c));
  36. memset(vis,,sizeof(vis));
  37. search();
  38. a[n]=tot;
  39. }
  40. while(scanf("%d",&n),n)
  41. {
  42. printf("%d\n",a[n]);
  43. }
  44. return ;
  45. }

下面附上另一个用时最短0ms  并且 容易理解的

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<vector>
  8. #include<map>
  9. #include<set>
  10. #include<stack>
  11. using namespace std;
  12. int n,c[],tot,a[];
  13. void search(int cur)
  14. {
  15. if(cur==n) //递归边界 , 只要走到了这里 , 所有皇后必然不冲突 .
  16. tot++;
  17. else
  18. for(int i=;i<n;i++)
  19. {
  20. int ok=;
  21. c[cur]=i; // 尝试将 cur 行的 皇后放在 i 列 .
  22. for(int j=;j<cur;j++) // 检查是否 个 前面的皇后冲突
  23. {
  24. if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j]) //
  25. {
  26. ok=;
  27. break;
  28. }
  29. }
  30. if(ok)
  31. search(cur+);
  32. }
  33. }
  34. int main()
  35. {
  36. for(n=;n<=;n++)
  37. {
  38. memset(c,,sizeof(c));
  39. tot=;
  40. search();
  41. a[n]=tot;
  42. }
  43. while(scanf("%d",&n),n) // 几皇后 ?
  44. {
  45. printf("%d\n",a[n]);
  46. }
  47. }

八皇后问题---详解---参考<<紫书>>的更多相关文章

  1. Spring Boot(八):RabbitMQ详解

    Spring Boot(八):RabbitMQ详解 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多 ...

  2. iOS开发——网络编程Swift篇&(八)SwiftyJSON详解

    SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...

  3. mybatis 源码分析(八)ResultSetHandler 详解

    本篇博客就是 myabtis 系列的最后一篇了,还剩 ResultSetHandler 没有分析:作为整个 mybatis 最复杂最繁琐的部分,我不打算按步骤一次详解,因为里面的主要内容就是围绕 re ...

  4. (新手向)N皇后问题详解(DFS算法)

    非常经典的一道题: N皇后问题: 国际象棋中皇后的势力范围覆盖其所在的行.列以及两条对角线,现在考察如下问题:如何在n x n的棋盘上放置n个皇后,使得她们彼此互不攻击 . 免去麻烦我们这里假定n不是 ...

  5. springboot(八):RabbitMQ详解

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...

  6. iOS开发-Runtime详解(简书)

    简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...

  7. docker-compose v3版本命令详解参考

    参考和指南 这些主题描述了Compose文件格式的第3版.这是最新的版本. Compose and Docker 兼容性矩阵 有几个版本的Compose文件格式 - 1,2,2.x和3.x.下表是快速 ...

  8. Spring Boot(八):RabbitMQ 详解

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将 RocketMQ 捐献给了 ...

  9. (转)Spring Boot(八):RabbitMQ 详解

    http://www.ityouknow.com/springboot/2016/11/30/spring-boot-rabbitMQ.html RabbitMQ 即一个消息队列,主要是用来实现应用程 ...

随机推荐

  1. 如何在 CentOS 7 上安装 Nginx

    本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Nginx 读作 engine x, 是一个免费的.开源的.高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点. ...

  2. python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序

    Python编程实战主要关注了四个方面 即:优雅编码设计模式.通过并发和编译后的Python(Cython)使处理速度更快.高层联网和图像.书中展示了在Python中已经过验证有用的设计模式,用专家级 ...

  3. reading/writing files in Python

    file types: plaintext files, such as .txt .py Binary files, such as .docx, .pdf, iamges, spreadsheet ...

  4. java--删除链表偶数节点

    public class ListNode { int data;//当前节点的值 ListNode next = null;//是指向下一个节点的指针/引用 public ListNode(int ...

  5. vue父组件向子组件传递参数

    父组件中引用的子组件 <pics :is-pics="showpics" // 这是我们要传递的参数 :is-product="productMsg" : ...

  6. PAT 1121 Damn Single

    "Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...

  7. codevs1009 产生数

    题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规 ...

  8. 20180710使用gh

    转自:http://www.ywnds.com/?p=14265 一.背景 GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具!下面是官方给出gh-o ...

  9. android Fragment用法

    Fragment常用的三个类:android.app.Fragment 主要用于定义Fragmentandroid.app.FragmentManager 主要用于在Activity中操作Fragme ...

  10. 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

    1267 老鼠的旅行  2012年CCC加拿大高中生信息学奥赛 题目描述 Description You are a mouse that lives in a cage in a large lab ...