青训营主题 3:寻友之旅

70 阅读2分钟

当青训营遇上码上掘金

题目

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

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

思路

很容易想到此问题属于搜索类问题。由于题目中要求的为最短时间,因此选择BFS(宽度优先搜索)更为适宜。如若采用DFS(深度优先搜索)很容易因为寻找所有的可能路径而陷入递归爆炸的情况或者超时的情况。如果题目中所求为所有可能的解,则可以使用DFS进行搜索。 由于每次移动所在的位置都不同,因此每次移动前都需要更新移动一步能到达的目标点位置。同时因为是搜索是有记忆的过程,因此还需要另外的空间记录每一次的移动路径。记录路径还可以帮助剪枝:可以通过记录所有走过的点,当下一次的目标点为走过的点时,跳过这种情况,减少了运算量和情况数。BFS可以很方便的求出最短路径,因为BFS为宽度优先搜索,最先被搜索到的位置一定是最先到达的。也符合题目的要求。 程序中采用a数组记录每次的目标点,使用b数组记录某个位置是否被访问到,使用STL库中的queue来建立BFS的基本框架。可以写出符合题目要求的代码。