【剑指offer】八皇后问题
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26614999
剑指offer上解决八皇后问题,没实用传统的递归或非递归回溯法,而是用了非常巧妙的全排列法。
先说下八皇后问题:在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即随意两个皇后不得处于同一行,同一列或者允许对角线上,求出全部符合条件的摆法。
全排列解决八皇后问题的思路例如以下:
因为8个皇后不能处在同一行,那么肯定每一个皇后占领一行,这样能够定义一个数组A[8],数组中第i个数字,即A[i]表示位于第i行的皇后的列号。先把数组A[8]分别用0-7初始化,接下来对该数组做全排列,因为我们用0-7这7个不同的数字初始化数组,因此随意两个皇后肯定也不同列,那么我们仅仅须要推断每一个排列相应的8个皇后中是否有随意两个在同一对角线上就可以,即对于数组的两个下标i和j,假设i-j==A[i]-A[j]或i-j==A[j]-A[i],则觉得有两个元素位于了同一个对角线上,则该排列不符合条件。
代码例如以下:
#include<stdio.h> void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
} /*
假设有符合条件的摆法,打印出全部的摆法,否则,什么也不打印
*/
void CubVertex(int *A,int len,int begin)
{
if(A==NULL || len!=8)
return; if(begin == len-1)
{
int i,j;
bool can = true; //是否又符合条件的摆法
for(i=0;i<len;i++)
for(j=i+1;j<len;j++)
if(i-j==A[i]-A[j] || i-j==A[j]-A[i])
{
//假设随意两个在一条对角线上,则不符合
can = false;
break;
}
//有符合的摆法,就打印出来
if(can)
{
for(i=0;i<len;i++)
printf("%d ",A[i]);
printf("\n");
}
}
else
{
int i;
for(i=begin;i<len;i++)
{
swap(&A[begin],&A[i]);
CubVertex(A,len,begin+1);
swap(&A[begin],&A[i]);
}
}
} int main()
{
int A[8] = {0,1,2,3,4,5,6,7};
CubVertex(A,8,0);
return 0;
}
測试结果:
四皇后:
四皇后总共同拥有2中摆法。
1、3、0、2的意思是指:第0行上的皇后摆放在第1个位置(从0開始),第1行上的皇后摆放在第3个位置,第3行上的皇后摆放在第0个位置,第4行上的皇后摆放在第2个位置。
八皇后:
八皇后总共同拥有92种摆法。
【剑指offer】八皇后问题的更多相关文章
- 剑指offer八之跳台阶
一.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路 a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法 ...
- 剑指Offer(十八):二叉树的镜像
剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...
- 剑指Offer(二十八):数组中出现次数超过一半的数字
剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...
- 剑指Offer——回溯算法
剑指Offer--回溯算法 什么是回溯法 回溯法实际是穷举算法,按问题某种变化趋势穷举下去,如某状态的变化用完还没有得到最优解,则返回上一种状态继续穷举.回溯法有"通用的解题法"之 ...
- 【读书笔记】剑指offer
导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/coding-interviews 九章算法的 lintcode 也有这本书的题目.https: ...
- 剑指 Offer 题目汇总索引
剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格 ...
- 剑指Offer——“你最大的缺点是什么”回答技巧及范例
剑指Offer--"你最大的缺点是什么"回答技巧及范例 问题分析:认识自己的缺点是一个巨大的优点, 当HR问到你缺点的时候, 你的机会来了, 请快展示你的自知之明吧!你想把优点 ...
- 剑指Offer——知识点储备-J2EE基础
剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ...
- 剑指Offer——银行考试
剑指Offer--银行考试 网申简历 一. 银行网申简历主要看哪些方面? 1.职业形象(30%),基本体现为证件照: 2.学校+成绩+校内表现(40%),体现为证书,成绩排名以及任职经历等: 3.校外 ...
随机推荐
- java web 学习一
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- java jvm学习笔记十一(访问控制器)
欢迎装载请说明出处: http://blog.csdn.net/yfqnihao/article/details/8271665 这一节,我们要学习的是访问控制器,在阅读本节之前,如果没有前面几节的 ...
- MyBatis 物理分页
MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回 为了在数据库层面上实现物理分页,又不改变原来MyBatis的函 ...
- android 触摸事件、点击事件的区别
针对屏幕上的一个View控件,Android如何区分应当触发onTouchEvent,还是onClick,亦或是onLongClick事件? 在Android中,一次用户操作可以被不同的View按次序 ...
- UITextView 相关知识点
1.得到UITextView的高度 - (CGRect)contentSizeRectForTextView:(UITextView *)textView { [textView.layoutMana ...
- C++一些特殊的类的设计
一.设计一个只能在栈上分配空间的类 重写类的opeator new 操作,并声明为private,一个大概的代码如下: class StackOnly { public: StackOnly(){ ...
- Multiclass Classification
之前我们都是在Binary classification的基础上学习算法和知识. 如何使用Binary classification算法进行Multiclass classification呢? (一 ...
- JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<HashMap类、TreeMap类>)
Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...
- PHP:PHP5.4连接SQLSERVER
在PHP5.4的环境下要连接SQLSERVER(2005/2008)数据库,需要以下步骤: 1.下载PHP5.4连接SQLSERVER的驱动(两个动态连接库)http://www.microsoft. ...
- Navicate
快捷键 1.ctrl+q 打开查询窗口 2.ctrl+/ 注释sql语句 3.ctrl+shift +/ 解除注释 4.ctrl+r 运行查询窗口的sql语句 5.ctrl+shift+r 只运行选中 ...