当青训营遇上码上掘金之”寻友之旅“

106 阅读2分钟

当青训营遇上码上掘金,接下来对主题三:寻友之旅进行讲解

题目介绍:

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

算法分析

这道题我们可以用广度优先搜素的思想来解答,从小青的节点开始搜索,编写算法不断搜索小青可以到达的节点,直到找到小码的节点。

我们使用一个数组来存储到达每个节点的时间,或者说步数,一步也就是步行一分钟或者坐公交一分钟。在计算过程中使用一个队列结构存储节点。

对于存入队列的节点,我们分别使用步行或公交的三种情况找到三个可到达的节点,判断这三个节点是否满足预设条件,不能小于0或者大于100000,且未被访问过。随后删除队列首节点,将这三个节点满足条件的加入队列。

对于入队的节点,我们直接设定它的步数为它的父节点的步数加一,不断循环,当遍历到小码节点时,输出此时步数数组的值即是我们想要的最快到达时间,当队列遍历完成后仍未得到小码对应的节点,我们返回一个-1,寻找最短时间失败。

算法设计

使用的最短时间函数和测试代码如下: