漫画:什么是八皇后问题
转载自 漫画:什么是八皇后问题?
题目是什么意思呢?
国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上?
让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:
下图的绿色格子是两个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:
那么,如何遵循规则,同时放置这8个皇后呢?让我们来看看小灰的回答。
———————————
什么是八皇后问题?
八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?
以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题。
如何解决八皇后问题?
所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......
如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法。
说起来有些抽象,我们来看一看递归回溯的详细过程。
1.第一层递归,尝试在第一行摆放第一个皇后:
2.第二层递归,尝试在第二行摆放第二个皇后(前两格被第一个皇后封锁,只能落在第三格):
3.第三层递归,尝试在第三行摆放第三个皇后(前四格被第一第二个皇后封锁,只能落在第五格):
4.第四层递归,尝试在第四行摆放第四个皇后(第一格被第二个皇后封锁,只能落在第二格):
5.第五层递归,尝试在第五行摆放第五个皇后(前三格被前面的皇后封锁,只能落在第四格):
6.由于所有格子都“绿了”,第六行已经没办法摆放皇后,于是进行回溯,重新摆放第五个皇后到第八格。:
7.第六行仍然没有办法摆放皇后,第五行也已经尝试遍了,于是回溯到第四行,重新摆放第四个皇后到第七格。:
8.继续摆放第五个皇后,以此类推......
八皇后问题的代码实现?
解决八皇后问题,可以分为两个层面:
1.找出第一种正确摆放方式,也就是深度优先遍历。
2.找出全部的正确摆放方式,也就是广度优先遍历。
由于篇幅优先,我们本篇只介绍如何找出第一种正确摆放方式。
在研究代码实现的时候,我们需要解决几个问题:
1.国际象棋的棋盘如何表示?
很简单,用一个长度是8的二维数组来表示即可。
由于这里使用的是int数组,int的初始值是0,代表没有落子。当有皇后放置的时候,对应的元素值改为1。
在这里,二维数组的第一个维度代表横坐标,第二个维度代表纵坐标,并且从0开始。比如chessBoard[3][4]代表的是棋盘第四行第五列格子的状态。
2.如何判断皇后的落点是否合规?
定义一个check方法,传入新皇后的落点,通过纵向和斜向是否存在其他皇后来判断是否合规。
3.如何进行递归回溯?
递归回溯是本算法的核心,代码逻辑有些复杂
4.如何输出结果?
这个问题很简单,直接遍历二维数组并输出就可以。
5.如何把这些方法串起来?
在main函数里分三步来调用:
第一步:初始化
第二步:递归摆放皇后
第三步:最后输出结果。
其中Queen8是整个类的名字。
最终输出如下:
10000000
00001000
00000001
00000100
00100000
00000010
01000000
00010000
几点补充:
1.由于篇幅原因,这一篇只讲了如何找出第一种正确的八皇后摆放。大家如果有兴趣,可以对文中的代码稍作改动,实现找出所有八皇后摆放的代码。
2.本漫画纯属娱乐,还请大家尽量珍惜当下的工作,切勿模仿小灰的行为哦。
漫画:什么是八皇后问题相关推荐
- 漫画:什么是八皇后问题?
本文经授权转载自公众号程序员小灰 (ID:chengxuyuanxiaohui) ----- 第二天 ----- 题目是什么意思呢? 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的 ...
- C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题
C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...
- 递归/回溯:八皇后问题N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...
- 八皇后的一个回溯递归解法
解法来自严蔚敏的数据结构与算法. 代码如下: #include <iostream> using namespace std; const int N = 8;//皇后数 int coun ...
- Prolog学习:数独和八皇后问题
上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...
- 带你轻而易举的学习python——八皇后问题
首先我们来看一下这个著名的八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 在这个问题提出之后人们又将 ...
- 递归解决八皇后问题-小昝
引言 由于大学课堂中数据结构中并没有讲一些常见的算法,只是讲的比较简单的定义.所以拿出来暑假时间去研究经典的算法.本文章是研究的八皇后问题.八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 ...
- 十二、八皇后问题(递归回溯)
一.八皇后问题介绍 (本次使用回溯算法解决,之后会用贪心算法优化) 在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行. 同一列或同一斜线上,问有多少种摆法(9 ...
- Scheme来实现八皇后问题(2)
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址http://www.cnblogs.com/Colin-Cai/p/9790466.html 作者:窗户QQ/ ...
最新文章
- 玩电子游戏的神经网络,告诉我们大脑是如何决策的
- java 持续集成工具_Jenkins集成式项目控件下载
- perl中Net::FTP帮助文档
- HDLBits答案(5)_Generate实例化模块
- 你有可能错过的东西:IIS7 ULR-Rewrite已经成为正式版本
- java 线程池 资源回收_JAVA线程池资源回收的问题
- ReactJs 第三章 React元素的渲染
- C++引用和指针区别
- UnityGI4:混合光照
- 如何解决Greenplum pg_dump备份时的分布策略缺失等问题
- 学习C++必须掌握的概念
- pythonATM,购物车项目实战_补充4-db模块
- 模拟实现memcpy、memmove函数
- cr3格式是什么意思_佳能rp的cr3如何打开?修图为什么要用raw格式?转码又是什么?...
- vum安装mysql_CentOS安装MySQL的完整步骤
- 双曲函数奇偶性_双曲函数的来历是什么,与三角函数有什么关系?
- 参加数据库嘉年华有感
- mac 绑定阿里企业邮箱
- python 已知三角形的三条边,通过反三角函数计算出三角形的三个角;其中用到math的引用;
- 自定义android模拟器,在模拟器上运行自定义Android ROM
热门文章
- [Qt入门]QTreeWidget控件创建
- C++map容器-查找和统计
- 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)
- 在线进位制计算机,计算机基础知识进位计数制.pdf
- php 后门代码_分析一段PHP的后门代码,很恶心
- Mult-Nim博弈
- Codeforces Round #656 (Div. 3) F. Removing Leaves 贪心 + 模拟
- CF1156F. Card Bag
- AGAGA XOOORRR CodeForces - 1516B
- 一起开心暑假集训第一周限时训练 2020/7/5