当青训营遇上码上掘金

50 阅读2分钟

有幸可以参加*[青训营X码上掘金]*主题创作活动,本次我选择的是主题3,题目如下:

主题 3:寻友之旅

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

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

解题思路:

这道题类似于求最短路径,首先我们要确定的是:公交速度要远快于步行,所以要尽可能得坐公交。 这种题一般采用广度优先搜索的方法,即BFS。

首先如果N>K,那么小青只可以步行前去小码家,所需时间为:N-K;

如果N=K,那么直接返回所需时间为0即可;

如果N<K,那么就正常利用BFS进行求解。

我们可以使用一个队列来记录小青所到达的所有位置,初始状态下,将小青所在位置入队,将时间加一,然后将上一分钟所在位置出队,根据该位置去判断小青下一步可到达的位置是否与小码所在位置相同,若相同,则输出答案,否则,我们需要考虑三种情况,将三种可到达位置分别入队,重复以上操作,直到小青可到达位置包含小码所在位置。同时需要考虑测试情况,准备使用对数器。

实现代码如下: