数据结构与算法(Java版) | 几个经典的算法面试题(下)

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法(Java版) | 几个经典的算法面试题(下)相关的知识,希望对你有一定的参考价值。

上一讲,我给大家介绍了两个经典算法面试题,即字符串匹配问题和汉诺塔游戏,这一讲,我再来给大家介绍两个经典算法面试题,它们就是八皇后问题和马踏棋盘算法,注意,马踏棋盘算法也被称为骑士周游问题哟!

接下来,我就先来给大家介绍一下八皇后问题这个经典算法面试题吧!

八皇后问题

八皇后问题,是一个古老而著名的问题,而且还是回溯算法的一个典型案例。该问题是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的,即在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,也就是说任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法?

这个问题,当时一个叫高斯的人认为一共有76种方案,高斯相信大家都知道,他是一个著名的数学家,小学的时候咱们就学过高斯定律,对他有印象吧!反转来了,在1854年,柏林的象棋杂志上有不同的作者发表了40种不同的解,后来又有人用图论的方法解出了92种结果,的确,如果用图论的方式来编程实现,那么确实是有92种摆法。当然,等到计算机发明后,多种计算机语言就都可以用来解决此问题了!

注意,这里我只是想给大家简单介绍一下八皇后问题,至于具体编程实现,那就要等到后面专门讲这个八皇后问题时再来给大家写代码实现了。

刚刚好,网络上就有一款这样的八皇后在线玩的小游戏,游戏地址是https://www.novelgames.com/zh/queens/,打开该地址,你便能尽情玩耍了!我看大家眼馋,要不接下来我给大家玩一把吧!看看我能不能在棋盘上摆出一个符合要求的八皇后摆法!不过,在玩游戏之前,我需要先给大家说明一下,就是符合要求的八皇后摆法一共有92种,每一种摆法都让我试一下,那我肯定搞不定,但是一两种摆法我还是可以摆出来的,这一点对我来说没有任何问题啊!

打开该游戏,我来给大家玩一把,看我怎样摆出一个符合要求的八皇后摆法。当然,如果大家有兴趣,不妨自己也来玩一把!

首先,将一个皇后摆在棋盘的最左下角的那个格子。

摆好之后,那么第二行的第一个格子和第二个格子你就不能摆了,因为如果你摆了,那这两个皇后就会处在同一列或者同一斜线上,游戏自然也就无法继续玩下去了。

那第二行我们摆在哪一个格子呢?摆在第五个格子就OK了。

继续,第三行我们摆在第八个格子上。

继续,第四行我们摆在第六个格子上。

继续,第五行我们摆在第三个格子上。

继续,第六行我们摆在第七个格子上。

继续,第七行我们摆在第二个格子上。

最后一行我们摆在第四个格子上。

至此,游戏完美通关!

现在,大家应该对这个游戏感兴趣了吧!哈哈哈😄,还是挺有意思的啊,大家呢也不妨先在这里玩一玩,后续我再专门给大家去讲这个八皇后问题的回溯算法,千万不要着急哟!

马踏棋盘算法

下面我们再来看一个非常有意思的经典算法面试题,即马踏棋盘算法,当然,有些人也把它叫做骑士周游问题。

马踏棋盘算法是这样描述的,将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,然后再按照走棋规则(即马走日字,下过象棋的应该都知道马是走日字的吧!)进行移动,要求每个方格马只能允许进入一次,而且还得走遍棋盘上全部64个方格。

描述完马踏棋盘算法之后,可能有童鞋就要问了,它会用到什么算法呢?这里,我就提前告诉大家了,它会用到图的深度优先遍历算法(即DFS算法),但是如果只使用这一种算法的话,那又会有一个问题,就是效率将变得低下,比如马随机放在国际象棋的某个方格上之后,可能需要耗费30秒才能算出这匹马应该第一步怎么走,然后第二步再怎么走。

但如果此时再加上贪心算法进行优化的话,那么效率就将会得到大幅度提升。也就是说,马踏棋盘会使用到两种算法,即图的深度优先遍历算法(即DFS算法)和贪心算法,其中,贪心算法是用来进行优化的。总之,在不同的场景下,考虑用什么算法是非常重要的。

而且,现在好一点的公司在面试的时候都会出各种各样的算法题来考面试者了,这个想必大家都有清晰认识吧!而算法的基础又是数据结构,恰巧我这套系列教程就是来讲数据结构与算法的,因此大家来学我这套系列教程那就是再好不过的了,何谓正逢其时,这就是!

刚刚好,网络上就有一款这样的马踏棋盘在线玩的小游戏,游戏地址是https://u.ali213.net/detail/403.html,打开该地址,我们同样也来玩一把这个小游戏。当然,如果大家有兴趣,不妨自己也来玩一把!

开始游戏之后,你会发现该游戏为了简化,并没有给出一个8×8的国际象棋棋盘,而是给的一个6×6的国际象棋棋盘,如下图所示。

下面,我就来给大家玩一把这个游戏,只是这次我想给大家演示一个错误的走法,也就是说这次我会乱走,大家看到什么时候该游戏会出问题,不过这里我得提请大家注意,就是该问题得等到本套系列教程临近结尾的时候再来通过编程的方式解决,因为马踏棋盘游戏的代码实现涉及到的内容很多,例如图的深度优先遍历算法(即DFS算法)以及贪心算法的一个优化,而正是鉴于此,我才会把马踏棋盘算法放到本套系列教程的结尾来专门向大家进行讲解。

这里,我就瞎走了啊!首先,将马走到如下这个格子处,可以看到一开始马所在的位置已经变成了一颗*,这意味着马已经走过了该位置,下次就不能再走该位置了。

那接下来马还可以走哪里呢?走有马头的格子。于是,我就继续瞎走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

继续再走,将马走到如下这个格子处。

最后再走,直至将马走到最左上角的那个格子处,这时你会发现游戏终于可以结束掉了,因为一旦将马走到最左上角的那个格子处,马就不能按照马走日字的规则继续往下走了,游戏自然就要结束掉了。

直至游戏结束,你会发现咱们一共走了25步,而要成功完成这个马踏棋盘游戏,对于一个6×6的国际象棋棋盘来讲,理论上来说,咱们应该一共走35步。

至此,关于这个马踏棋盘游戏,大家看清楚以上我是怎么走的了吧!以及最后为什么又会失败,想必大家也已经很清楚了,这里我就不再赘述了。

哎勒个我去,马踏棋盘这个经典的算法面试题,我总算是给大家介绍完了,真不容易啊!

以上是关于数据结构与算法(Java版) | 几个经典的算法面试题(下)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法(Java版) | 几个经典的算法面试题(下)

数据结构与算法(Java版) | 关于以上几个经典算法面试题的一个小结

数据结构与算法(Java版) | 关于以上几个经典算法面试题的一个小结

数据结构与算法(Java版) | 关于以上几个经典算法面试题的一个小结

数据结构与算法(Java版) | 几个经典的算法面试题(上)

数据结构与算法(Java版) | 几个经典的算法面试题(上)