漫画:什么是八皇后问题?

简介: 国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上?让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:下图的绿色格子是两个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:那么,如何遵循规则,同时放置这8个皇后呢?让我们来看看小灰的回答。

image.png

image.png

—————  第二天  —————

image.pngimage.png


image.png

题目是什么意思呢?


国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上?


让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:


image.png


下图的绿色格子是两个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:


那么,如何遵循规则,同时放置这8个皇后呢?让我们来看看小灰的回答。

image.png


image.png————————————

image.png

————————————

image.png

image.png

image.png

什么是八皇后问题?


八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?


以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题。


image.png


image.png


如何解决八皇后问题?


所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......


如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法。


说起来有些抽象,我们来看一看递归回溯的详细过程。


1.第一层递归,尝试在第一行摆放第一个皇后:


image.png


2.第二层递归,尝试在第二行摆放第二个皇后(前两格被第一个皇后封锁,只能落在第三格):


image.png


3.第三层递归,尝试在第三行摆放第三个皇后(前四格被第一第二个皇后封锁,只能落在第五格):


image.png


4.第四层递归,尝试在第四行摆放第四个皇后(第一格被第二个皇后封锁,只能落在第二格):


image.png


5.第五层递归,尝试在第五行摆放第五个皇后(前三格被前面的皇后封锁,只能落在第四格):


108782fd9c0779798fba29b946f298ca.png

6.由于所有格子都“绿了”,第六行已经没办法摆放皇后,于是进行回溯,重新摆放第五个皇后到第八格。:


591930371e2d7ac11df22de9661efa0d.png


7.第六行仍然没有办法摆放皇后,第五行也已经尝试遍了,于是回溯到第四行,重新摆放第四个皇后到第七格。:


25fbf2bdc10795cfef07251b443ea710.png


8.继续摆放第五个皇后,以此类推......

647e847f2a903174fc5eefcffd075f3f.jpg

3cad7cc27b4d419cddb8d07a02c68ba5.jpg


八皇后问题的代码实现?


解决八皇后问题,可以分为两个层面:

1.找出第一种正确摆放方式,也就是深度优先遍历。

2.找出全部的正确摆放方式,也就是广度优先遍历。


由于篇幅优先,我们本篇只介绍如何找出第一种正确摆放方式。


在研究代码实现的时候,我们需要解决几个问题:


1.国际象棋的棋盘如何表示?

很简单,用一个长度是8的二维数组来表示即可。

2ce4b4e22b8fc8521750855658e6aa79.png


由于这里使用的是int数组,int的初始值是0,代表没有落子。当有皇后放置的时候,对应的元素值改为1。


在这里,二维数组的第一个维度代表横坐标,第二个维度代表纵坐标,并且从0开始。比如chessBoard[3][4]代表的是棋盘第四行第五列格子的状态。


2.如何判断皇后的落点是否合规?

2ac0faea3a905afc2e221856be0da7de.png


定义一个check方法,传入新皇后的落点,通过纵向和斜向是否存在其他皇后来判断是否合规。


3.如何进行递归回溯?

6991d55d0c83fd61855b9e6967ae8119.jpg


递归回溯是本算法的核心,代码逻辑有些复杂


4.如何输出结果?

这个问题很简单,直接遍历二维数组并输出就可以。


31782b4aba6078426785060ddaefe9aa.png


5.如何把这些方法串起来?


在main函数里分三步来调用:

第一步:初始化

第二步:递归摆放皇后

第三步:最后输出结果。


其中Queen8是整个类的名字。


64395615ca90609a9addceb3cbb3723b.png


最终输出如下:


10000000

00001000

00000001

00000100

00100000


9334e8203a1e0002f508d5118a77c2ed.jpg71d7cd3aa9fa6aee18aaa906da329723.jpg


00000010

01000000

00010000


几点补充:

1.由于篇幅原因,这一篇只讲了如何找出第一种正确的八皇后摆放。大家如果有兴趣,可以对文中的代码稍作改动,实现找出所有八皇后摆放的代码。

2.本漫画纯属娱乐,还请大家尽量珍惜当下的工作,切勿模仿小灰的行为哦。


—————END—————



相关文章
|
4月前
【蓝桥杯】[递归]母牛的故事
蓝桥杯——[递归]母牛的故事
57 1
【蓝桥杯】[递归]母牛的故事
|
Cloud Native
【刷题日记】473. 火柴拼正方形
本次刷题日记的第 52 篇,力扣题为:473. 火柴拼正方形,中等
【洛谷算法题】B2029-大象喝水【入门1顺序结构】
【洛谷算法题】B2029-大象喝水【入门1顺序结构】
|
算法
算法创作|纸牌三角形
算法创作|纸牌三角形
67 0
|
算法 测试技术
【五一创作】牛客网——有理算法
【五一创作】牛客网——有理算法
85 0
|
机器学习/深度学习 人工智能
把所有的谎言献给你β(找规律数学题)
梓川咲太的面前坐着野兔先辈,作为约定,只好乖乖的打开笔记本开始学习了。 “加法符号写歪了,变成了乘法符号,在算式的第三行那个地方。”樱岛麻衣突然开口。
165 0
把所有的谎言献给你β(找规律数学题)
|
存储 算法
漫画:什么是动态规划?(整合版)
题目: 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。
125 0
漫画:什么是动态规划?(整合版)
|
算法
漫画:什么是鸡尾酒排序?(修订版)
昨天小灰发布的漫画中存在一些勘误,所以今天重新发布一篇修订版,修正了代码当中的一些细节问题。在上一篇漫画中,小灰介绍了冒泡排序的思路和几种变化:漫画:什么是冒泡排序?那么,鸡尾酒排序又是何方神圣呢?我们这一期将会详细讲述。
141 0
漫画:什么是鸡尾酒排序?(修订版)
|
搜索推荐 算法
漫画:三种 “奇葩” 的排序算法
介绍三种“异想天开”的排序算法。
145 0
漫画:三种 “奇葩” 的排序算法