青训营主题创作活动-寻友之旅

41 阅读2分钟

当青训营遇上码上掘金

题目

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

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

解答

首先阅读题目,从题目中可以了解到,小青在N点,小码在K点。K不动,N需要想办法移动到K点。 N的每一单位时间的移动方式有下列几种

  • 步行:从X向前或向后1个单位
  • 公交:从X向前移动到2X

题目要求我们计算出N到K的最短时间。阅读完题目,我们首先可以想到,从N到K点的路线会有很多种。

假设N=2,K=5。从N到K,最快的方式应该是N*2+1,结果为2。即在每个节点处,N都可以选择+1/-1/*2来移动到下一步。所以我们可以使用广度优先搜索,在N走到每一个节点的时候都遍历下一个可能走到的地方,并且计算到每个节点的所用时间。

广度优先搜索需要用到队列,在初始化时将N作为需要遍历的节点,放入队尾,并且设置result字典,用来存储每个节点所对应的需要的时间,并初始化N的时间为0。

每次循环都从队首获取元素,并且判断当前节点是否是目标节点,如果是,就退出循环,并且返回所需要的时间。如果不是,就判断下面可能走的节点是否已经计算过了,没计算过就将该节点加入队列,继续计算,并将走到这个节点所需要的时间进行存储,方便后续返回。

代码如下:

(没搞懂这个玩意咋设置input的数据,所以直接填参数运行)