“当青训营遇上码上掘金”题目解析

11 阅读2分钟

“当青训营遇上码上掘金” 题目描述

小青和小码住在一条直线上,小青当前在地点 N,小码在地点 K。 小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1。 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X(公交不可以向后走)。 问题

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

对于这道题目,如果我们从简单的想法入手,那么我们可以从当前位置,不断地向前走或者乘二,直到到达目标位置为止。这种方法虽然简单,但显然是不能保证最优的。因此,我们需要想出一个更加高效的算法来解决问题。

BFS(广度优先搜索)算法是一种常见的图论算法,用于在图形中找到最短路径。在本题中,我们可以使用BFS算法来解决问题。具体的,我们可以利用队列来存储当前的位置,并从队列头部不断地取出元素,直到到达目标位置为止。

首先,我们将起点加入队列中,然后从队列的头部取出当前的位置,计算其相邻的两个位置(即向前走一步和乘二),如果这两个位置都没有被访问过,则将其加入队列中。同时,我们还需要更新每个位置的到达时间。当到达目标位置时,我们就可以通过该位置的到达时间来得到小青到小码家的最短时间。

需要注意的是,在执行BFS算法时,我们需要通过一个标记数组。 要解决这个问题,我们可以使用广度优先搜索(BFS)算法。 BFS 算法从起点开始,将所有能够到达的节点都放入队列中,然后从队列的头部拿出最先到达的节点,接着将与这个节点相邻的所有节点也加入队列中。这个过程会不断重复,直到所有的节点都被搜索到为止。

在这个问题中,我们可以把 N 点作为起点,把 K 点作为终点。然后我们可以使用队列存储所有当前能够到达的节点。每次我们从队列中取出一个节点,检查它是否已经到达终点 K,如果是,我们就找到了最短路径。如果不是,我们可以计算它通过步行或公交能够到达的两个节点,并把这两个节点加入队列中。

在 BFS 算法中,我们还需要记录每个节点的步数