八皇后问题---详解---参考<<紫书>>
在一个8*8的棋盘上 放置八个皇后 , 使得他们互相不攻击(皇后攻击范围为 同行同列同对角线) ,
方法一 :
从64个格子中 选一个子集 , 使得 " 子集 中恰好有八个元素 , 且任意选出的两个格子都不是同一行,同一列同,一对角线" , 这是子集枚举问题 , 然而 , 64个格子的自己有2^64个 , 所需处理数据过大 !
方法二:
从64个格子中 选八个格子 , 称为组合生成问题 , 根据组合数学 有 4.426*10^9中方案 , 虽然比第一种好 , 但是然并卵 .
---------------------------我是分割线--------------------------------------
经过思考你会不难发现下面一种方法 , 每一行每一列恰好会放一个皇后 , 所以可以从第一行开始放 , 然后考虑第二行 , 依次进行 下去 !
这样就变成了全排列生成问题 , 这样的排列有 8! = 40320个 , 枚举量不会超过该数字
然而 如果每次都枚举这么多次的话 也会超时的 , 所以我们可以采用回溯的方法 或者 用 上/下一个排列 .
- // 这是一种很常用的方法 ,平时的搜索 都是这 一种形式
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #include<map>
- #include<set>
- #include<stack>
- using namespace std;
- int tot,c[],vis[][],n,a[];
- void search(int cur)
- {
- if(cur==n)
- tot++;
- else
- for(int i=;i<n;i++)
- {
- if(!vis[][i]&&!vis[][cur+i]&&!vis[][cur-i+n])
- {
- c[cur]=i;
- vis[][i]=vis[][cur+i]=vis[][cur-i+n]=;
- search(cur+);
- vis[][i]=vis[][cur+i]=vis[][cur-i+n]=;
- }
- }
- }
- int main()
- {
- for(n=;n<=;n++)
- {
- tot=;
- memset(c,,sizeof(c));
- memset(vis,,sizeof(vis));
- search();
- a[n]=tot;
- }
- while(scanf("%d",&n),n)
- {
- printf("%d\n",a[n]);
- }
- return ;
- }
下面附上另一个用时最短0ms 并且 容易理解的
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #include<map>
- #include<set>
- #include<stack>
- using namespace std;
- int n,c[],tot,a[];
- void search(int cur)
- {
- if(cur==n) //递归边界 , 只要走到了这里 , 所有皇后必然不冲突 .
- tot++;
- else
- for(int i=;i<n;i++)
- {
- int ok=;
- c[cur]=i; // 尝试将 cur 行的 皇后放在 i 列 .
- for(int j=;j<cur;j++) // 检查是否 个 前面的皇后冲突
- {
- if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j]) //
- {
- ok=;
- break;
- }
- }
- if(ok)
- search(cur+);
- }
- }
- int main()
- {
- for(n=;n<=;n++)
- {
- memset(c,,sizeof(c));
- tot=;
- search();
- a[n]=tot;
- }
- while(scanf("%d",&n),n) // 几皇后 ?
- {
- printf("%d\n",a[n]);
- }
- }
八皇后问题---详解---参考<<紫书>>的更多相关文章
- Spring Boot(八):RabbitMQ详解
Spring Boot(八):RabbitMQ详解 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多 ...
- iOS开发——网络编程Swift篇&(八)SwiftyJSON详解
SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...
- mybatis 源码分析(八)ResultSetHandler 详解
本篇博客就是 myabtis 系列的最后一篇了,还剩 ResultSetHandler 没有分析:作为整个 mybatis 最复杂最繁琐的部分,我不打算按步骤一次详解,因为里面的主要内容就是围绕 re ...
- (新手向)N皇后问题详解(DFS算法)
非常经典的一道题: N皇后问题: 国际象棋中皇后的势力范围覆盖其所在的行.列以及两条对角线,现在考察如下问题:如何在n x n的棋盘上放置n个皇后,使得她们彼此互不攻击 . 免去麻烦我们这里假定n不是 ...
- springboot(八):RabbitMQ详解
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...
- iOS开发-Runtime详解(简书)
简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...
- docker-compose v3版本命令详解参考
参考和指南 这些主题描述了Compose文件格式的第3版.这是最新的版本. Compose and Docker 兼容性矩阵 有几个版本的Compose文件格式 - 1,2,2.x和3.x.下表是快速 ...
- Spring Boot(八):RabbitMQ 详解
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将 RocketMQ 捐献给了 ...
- (转)Spring Boot(八):RabbitMQ 详解
http://www.ityouknow.com/springboot/2016/11/30/spring-boot-rabbitMQ.html RabbitMQ 即一个消息队列,主要是用来实现应用程 ...
随机推荐
- 如何在 CentOS 7 上安装 Nginx
本文首发:开发指南:如何在 CentOS 7 上安装 Nginx Nginx 读作 engine x, 是一个免费的.开源的.高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点. ...
- python经典书籍:Python编程实战 运用设计模式、并发和程序库创建高质量程序
Python编程实战主要关注了四个方面 即:优雅编码设计模式.通过并发和编译后的Python(Cython)使处理速度更快.高层联网和图像.书中展示了在Python中已经过验证有用的设计模式,用专家级 ...
- reading/writing files in Python
file types: plaintext files, such as .txt .py Binary files, such as .docx, .pdf, iamges, spreadsheet ...
- java--删除链表偶数节点
public class ListNode { int data;//当前节点的值 ListNode next = null;//是指向下一个节点的指针/引用 public ListNode(int ...
- vue父组件向子组件传递参数
父组件中引用的子组件 <pics :is-pics="showpics" // 这是我们要传递的参数 :is-product="productMsg" : ...
- PAT 1121 Damn Single
"Damn Single (单身狗)" is the Chinese nickname for someone who is being single. You are suppo ...
- codevs1009 产生数
题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规 ...
- 20180710使用gh
转自:http://www.ywnds.com/?p=14265 一.背景 GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具!下面是官方给出gh-o ...
- android Fragment用法
Fragment常用的三个类:android.app.Fragment 主要用于定义Fragmentandroid.app.FragmentManager 主要用于在Activity中操作Fragme ...
- 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛
1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛 题目描述 Description You are a mouse that lives in a cage in a large lab ...