转载请注明出处: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】八皇后问题的更多相关文章

  1. 剑指offer八之跳台阶

    一.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.思路 a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法 ...

  2. 剑指Offer(十八):二叉树的镜像

    剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...

  3. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  4. 剑指Offer——回溯算法

    剑指Offer--回溯算法 什么是回溯法 回溯法实际是穷举算法,按问题某种变化趋势穷举下去,如某状态的变化用完还没有得到最优解,则返回上一种状态继续穷举.回溯法有"通用的解题法"之 ...

  5. 【读书笔记】剑指offer

    导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/coding-interviews 九章算法的 lintcode 也有这本书的题目.https: ...

  6. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  7. 剑指Offer——“你最大的缺点是什么”回答技巧及范例

    剑指Offer--"你最大的缺点是什么"回答技巧及范例   问题分析:认识自己的缺点是一个巨大的优点, 当HR问到你缺点的时候, 你的机会来了, 请快展示你的自知之明吧!你想把优点 ...

  8. 剑指Offer——知识点储备-J2EE基础

    剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ...

  9. 剑指Offer——银行考试

    剑指Offer--银行考试 网申简历 一. 银行网申简历主要看哪些方面? 1.职业形象(30%),基本体现为证件照: 2.学校+成绩+校内表现(40%),体现为证书,成绩排名以及任职经历等: 3.校外 ...

随机推荐

  1. .NET面试题系列

    索引: .NET框架基础知识[1] - http://www.cnblogs.com/haoyifei/p/5643689.html .NET框架基础知识[2] - http://www.cnblog ...

  2. hdu 4057(ac自动机+状态压缩dp)

    题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...

  3. C# chart绑定数据的方式整理

    C#chart 画图曲线的条数决定是你的数据源也就Series.Series是对象 你动态创建就可以了. 一.数组, List 等简单Collection类型的方式 Series s1= new Se ...

  4. JS:实用功能

    ylbtech-jQuery:函数-导航 添加样式(addClass).移除样式(removeClass) 轮替函数(toggle()) 选项拼加 全选 网页刷点器 jQuery:3.1,添加样式(a ...

  5. mybatis中的变量#与$

    ibatis中使用select top #num# * from tableName出现错误.由于初次用ibatis还不知道在它里边拼写SQL语句的一些规则,导致一些自认为很平常的SQL语句,在它这里 ...

  6. Delphi TRichEdit加载word内容

    procedure TForm1.btn6Click(Sender: TObject);var WordApp: Variant; //声明一个word对象beginWordApp := Create ...

  7. Clang Language Extensions

    Xcode 本文是自<Clang Language Extensions> 中选取部分与 Objective-C 相关的内容翻译,由于作者水平有限,如存在理解错误或翻译不到位的地方,还请指 ...

  8. Android JNI之C/C++层调用JAVA

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930032.html 从C/C++层调用JAVA层代码步骤: 1. 在JAVA类中创建java方法和本地方法 ...

  9. oracle10~11g在centos5~6版本上安装整体总结如下

    1,oracle10g在centos/RedHat5~6主要的安装步骤,我主要记录核心的,别的在此就不多说了,都是些linux基本维护指令,关闭iptables,selinux,或是放行相应的端口,本 ...

  10. HDU 5768 Lucky7 (中国剩余定理 + 容斥 + 快速乘法)

    Lucky7 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 Description When ?? was born, seven crow ...