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

59 阅读2分钟

当青训营遇上码上掘金,以下是寻友之旅主题BFS思路题解及代码。

题目

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)

题解

广度优先搜索(BFS)是本题目最容易想到的方法之一。

在本题中,小青有三种移动方式可以选择:n+1,n-1,n*2(注意应当在规定范围内)。我们需要遍历所有可能到达的节点,找到从起点到终点的最短路径。 BFS是一种合适的算法。

BFS按照移动方式对节点进行遍历,移动一步(三种移动方式均被称为移动一步)所需时间为1分钟,当第一次遇到终点节点时,到达该节点的步数即代表最短时间。

实现: 可以用一个队列来存储当前节点,使用布尔数组记录节点访问情况,然后每次从队列中取出一个节点并将其移动方式可达的节点加入队列。在每个节点上记录到达该节点的最短时间。
1、当遇到终点时,返回该节点的最短时间(步数)即可。
2、若步行到可到达节点/公交可到达节点未访问过,将节点加入队列,更新所到达节点步数,并将节点访问情况记录为已访问。

代码(c++)