你知道八皇后嘛?就是那个八皇后
说起八皇后,其实这是一个古老而著名的问题。该问题是19世纪著名的数学家高斯1850年提出:在一个8*8国际象棋盘上,有8个皇后,每个皇后占一格;要求皇后之间不会出现相互“攻击”的现象,即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法?
这个问题的解法有很多,不过比较常见的就是递归算法和回溯算法。
什么是回溯算法呢?
回溯算法其实也叫做试探法,它是一种搜索问题的解的方法。
它的的基本思想是在一个包含所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。
而回溯算法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。
那什么又是递归算法呢?
递归算法说白了就是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。
而递归算法的本质及时递归函数,递归函数就是直接或间接调用自身的函数,也就是自身调用自己;是不是有点乱套啊,可能对于刚接触递归的同学,可能难以理解递归,难以理解的点可能很多。我们以后慢慢来学,不着急。
介绍完这两种算法之后,我们再来具体看下如何用这两种算法来处理八皇后问题。
我们先来看回溯算法,也就是非递归算法的示例代码:
#include <iostream>
using std::cout;
using std::endl;#include <iomanip>
using std::setw;#include <cmath>
//非递归算法解决八皇后问题。求出可能的92种。
// using std::abs;int main()
{static int queen[9];static int count=1;for (int A=1;A<=8;A++){for (int B=1;B<=8;B++){if (B==A){continue;}queen[2]=B;if ((abs(B-A))==1){continue;}queen[1]=A;for (int C=1;C<=8;C++){if ((C==B) || (C==A)){continue;}if ((abs(C-B)==1)||(abs(C-A)==2)){continue;}queen[3]=C;for (int D=1;D<=8;D++){if ((D==C)||(D==B)||(D==A)){continue;}if ((abs(D-C)==1)||(abs(D-B)==2)||(abs(D-A)==3)){continue;}queen[4]=D;for (int E=1;E<=8;E++){if ((E==D)||(E==C)||(E==B)||(E==A)){continue;}if ((abs(E-D)==1)||(abs(E-C)==2)||(abs(E-B)==3)||(abs(E-A)==4)){continue;}queen[5]=E;for (int F=1;F<=8;F++){if ((F==E)||(F==D)||(F==C)||(F==B)||(F==A)){continue;}if ((abs(F-E)==1)||(abs(F-D)==2)||(abs(F-C)==3)||(abs(F-B)==4)||(abs(F-A)==5)){continue;}queen[6]=F;for (int G=1;G<=8;G++){if ((G==F)||(G==E)||(G==D)||(G==C)||(G==B)||(G==A)){continue;}if ((abs(G-F)==1)||(abs(G-E)==2)||(abs(G-D)==3)||(abs(G-C)==4)||(abs(G-B)==5)||(abs(G-A)==6)){continue;}queen[7]=G;for (int I=1;I<=8;I++){if ((I==G)||(I==F)||(I==E)||(I==D)||(I==C)||(I==B)||(I==A)){continue;}if ((abs(I-G)==1)||(abs(I-F)==2)||(abs(I-E)==3)||(abs(I-D)==4)||(abs(I-C)==5)||(abs(I-B)==6)||(abs(I-A)==7)){continue;}queen[8]=I;cout<<" NO."<<setw(2)<<count<<": ";for (int i=1;i<=8;i++){cout<<setw(3)<<queen[i];}count++;cout<<endl;}}}}}}}}return 0;
上面就是具体的示例代码,大家可以自己在自己的电脑上调试下,我们再来看下用递归算法怎么处理这个问题:
#include <iostream>
using namespace std;
//递归算法解决八皇后问题。总共有92种解法。
int c[20], n=8, cnt=0;
void print(){for(int i=0; i<n; ++i){for(int j=0; j<n; ++j){if(j == c[i]) cout<<"1 ";else cout<<"0 ";}cout<<endl;}cout<<endl;
}
void search(int r){if(r == n){print();++cnt;return;}for(int i=0; i<n; ++i){c[r] = i;int ok = 1;for(int j=0; j<r; ++j)if(c[r]==c[j] || r-j==c[r]-c[j] || r-j==c[j]-c[r]){ok = 0;break;}if(ok) search(r+1);}
}
int main(){search(0);cout<<cnt<<endl;return 0;
}
上面这部分这是递归算法的代码,看着是不是比回溯算法的代码少很多,具体可以在自己的电脑上试试。
好了,这个著名的问题我们就先聊到这里,希望大家能够支持。
你知道八皇后嘛?就是那个八皇后相关推荐
- 七十八、 回溯法解决八皇后问题
@Author:Runsen 八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后. 来自百度百科,皇后的走法是可 ...
- 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II
回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...
- 8个成语接龙首尾相连_七七八八成语接龙_八开头的成语大全,八结尾的成语接龙...
向您解答有哪些七七八八的成语接龙是什么?用最后八字结尾来接八开头的成语,就是七七八八的成语接龙了.另外,我们也要知道七七八八的造句子内容更新请继续访问www.mygx.net.,无 第一位 第二位 第 ...
- 【二十八宿】又叫二十八舍或二十八星,是今人为观测日、
[二十八宿]又叫二十八舍或二十八星,是今人为观测日.月.五星运行而划分的二十八个星区,用来解释日.月.五星运行所到的地位.每宿蕴含若干颗恒星.二十八宿的称号,自西向东排列为:东方苍龙七宿(角.亢kan ...
- 八小时内求生存,八小时外求发展!赢在别人休息时!
八小时内求生存,八小时外求发展!赢在别人休息时! 常听朋友抱怨工作太忙,自己也感觉每天忙忙碌碌的.回想在深圳工作这些年,有努力也有进步,但总的说成就不大,比下虽有余,比上却不足. 想起来,还是自己努力 ...
- 八年级计算机教学论文,八年级教育教学论文
在面向新世纪的课程改革中,"以学生发展为本",提倡转变学生学习方式,突出强调学习过程的互动性和开放性,这一理念得到广泛认同.下面是小编为大家推荐的八年级教育教学论文,供大家参考. ...
- n皇后问题java_经典n皇后问题java代码实现
问题描述:在n*n的二维表格,把n个皇后在表格上,要求同一行.同一列或同一斜线上不能有2个以上的皇后. 例如八皇后有92种解决方案,五皇后有10种解决方案. public class TestQuee ...
- python遗传算法八皇后_遗传算法之:八皇后问题
八皇后问题: 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.正确的解有很多个,遗传算法并不直接计算一共有多少个解,而是寻找满 ...
- c支限界算法语言n皇后问题分,算法(八)-回溯法-N皇后问题
问题描述: 算法思想: 代码实现: #include using namespace std; class Queen { friend int nQueen(int);//求解八皇后 private ...
- 八皇后问题python_python求解八皇后问题
今天突然有个行外的朋友扔了一张图给我,希望我能帮他用python做一下这个作业--八皇后问题. 八皇后问题是一种经典的数学求解问题,规则是在8×8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇 ...
最新文章
- 完胜BERT!NLP预训练利器:小模型也有高精度,单个GPU就能训练
- Tungsten Fabric SDN — Service Chain — Heat Templates
- 我的Android进阶之旅------gt;Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed....
- 无法在WEB服务器上启动调试,Web 服务器配置不正确 解决
- JavaScript判断浏览器 Browser detect
- 使用Composer部署laravel框架
- 什么是物联网(IoT)?
- 51单片机矩阵按键模块
- 物联网应用技术有哪些?
- Unity商店下载的文件保存路径
- Day 11 Contractions and Present Perfect
- 对List集合中每个对象元素按时间顺序排序
- (完结)Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放
- 第二人生的源码分析(102)脚本的构造
- 【网络安全】登录问题(一)Session/Cookie源码分析
- 一个模仿微信群聊的H5页面
- SPSS分析实例操作
- win7下应用程序图标不显示
- STM32+HC05串口蓝牙设计简易的蓝牙音箱
- 恶梦护士 asa_噩梦就是JSON日期。 另外,JSON.NET和ASP.NET Web API
热门文章
- 一字节anti创建进程线程等回调
- 我是这样入门“机器学习”的
- std::thread vs CreateThread
- 入门】求一个两位数的个位和十位的和
- C++中含有无符号类型的表达式——有符号数与无符号数相加
- 计算机多媒体论文致谢,计算机专业论文致谢范文3篇
- Logo tools
- 基于BenchmarkSQL的Oracle数据库tpcc性能测试
- 127.0.0.1是什么地址?localhost呢?
- Skia引擎API整理介绍(skia in Android 2.3 trunk)