西山居10.14开发B卷编程题马踏斜日

这里说一下自己的思路,欢迎各位大佬一起交流
先回顾下题目:
在中国象棋中,马的移动方式是按照 "日" 字行进:
如果马在一张无限大的棋盘上,起始坐标为[0, 0],我们给定想要去的目标点 [x, y],要求输出马移动到目标点需要的最小移动次数
这里我用的是BFS,也就是广度优先算法
(1)为什么用bfs而不用dfs?
为什么会想用广度优先遍历呢?而不是用深度优先遍历呢?
因为这里的题目为:"棋盘无限大" ,所以我们没有边界可以判断,所以如果用深度遍历,可以一直递归下去,这样我们很难找到最小跳跃次数。但如果用广度优先遍历,第一层遍历就是起点的八个跳跃点,此时每个点的跳跃次数都为1;第二层遍历的话跳跃次数为2,所以只要我们找到了跳跃点为目标点,就可以直接把跳跃次数输出,ta就是最小跳跃次数。
因为第一次遍历,考虑的是跳跃次数为1的情况能不能到目标点,第二次遍历考虑的是跳跃次数为2的情况能不能到目标点
比如我们跳到了目标点,跳跃次数为4,则说明了:跳跃次数为1、跳跃次数为2、跳跃次数为3的所有跳跃可能都找不到目标点,而跳跃次数为4找到了目标点,所以最小跳跃次数自然为4了
(2)(2)思路
起点为【0, 0】
当跳跃次数为1次的情况(如下图1所示:)
即跳跃次数为1的情况有8种
当跳跃次数为2次时,就有64种情况了,结合之前跳跃次数为1的情况就有 8 + 64 = 72种情况(如下图2所示:)
当跳跃次数为3次时,就有8*8*8种情况了,结合之前的情况就有 584种 情况
所以当我们找到目标点时,看目前遍历的格子数量在哪个区间,就可以得到跳跃次数了,第一个遍历到的目标点也肯定是消耗了最小的跳跃次数
(3)代码示例
如下图3所示
全部评论
我写的代码长度可能只有你的1/4
点赞
送花
回复 分享
发布于 2023-10-16 22:54 湖南

相关推荐

点赞 4 评论
分享
牛客网
牛客企业服务