数据结构与算法(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步。

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

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

1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5.下列关于栈的叙述正确的是(D) A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出的特征D.栈有后进先出的特征 6.链表不具有的特点是(B)A.不必事先估计存储空间 B.可随机访问任一元素 C.插入删除不需要移动元素 D.所需空间线性表长度成正比 7.用链表表示线性表的优点是(便于插入和删除操作) 8.在单链表中,增加头结点的目的是(方便运算的实现) 9.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 10.线性表L=(a1,a2,a3,……ai,……an),下列说法正确的是(D) A.每个元素都有一个直接前件和直接后件 B.线性表中至少要有一个元素 C.表中诸元素的排列顺序必须是由小到大或由大到小 D.除第一个和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件 11.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D) A.必须是连续的 B.部分地址必须是连续的C.一定是不连续的 D.连续不连续都可以 12.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 13.树是结点的集合,它的根结点数目是(有且只有1) 14.在深度为5的满二叉树中,叶子结点的个数为(31) 15.具有3个结点的二叉树有(5种形态) 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为(13) 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba) 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为(DGEBHFCA) 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca) 20.数据库保护分为:安全性控制、 完整性控制 、并发性控制和数据的恢复。 1. 在计算机中,算法是指(解题方案的准确而完整的描述) 2.在下列选项中,哪个不是一个算法一般应该具有的基本特征(无穷性) 说明:算法的四个基本特征是:可行性、确定性、有穷性和拥有足够的情报。 3. 算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环) 4.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数) 5. 算法的空间复杂度是指(执行过程中所需要的存储空间) 6. 算法分析的目的是(分析算法的效率以求改进) ............ .................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值