抓住那头牛
描述
农夫约翰被告知一头逃跑的奶牛的位置,想立即抓住她。他从数字线上的点 N(0 ≤ N ≤ 100,000)开始,母牛在同一数字线上的点 K (0 ≤ K ≤ 100,000)。 农夫约翰有两种交通工具:步行和传送。
步行:FJ可以在一分钟内 从任何点X移动到点X-1或X + 1传送:FJ可以在一分钟内从任何点X移动到2× X点。
如果这头牛不知道它的追逐,根本不动,农夫约翰需要多长时间才能取回它?
输入
第 1 行:两个空格分隔的整数:N 和 K
输出
第 1 行:农夫约翰抓住逃跑的牛所需的时间最短,以分钟为单位。
示例输入
5 17
示例输出
4
提示
农夫约翰到达逃逸牛的最快方法是沿着以下路径移动:5-10-9-18-17,需要 4 分钟。
农夫有两种选择,一种是传送(* 2),一种是移动(+ 1, - 1)
由于是计算分钟的,还是采用BFS
由前面那题我们可以采用一种新的策略来记忆时间,就是用一个step数组
BFS
def BFS(n, k): import queue q = queue.Queue() q.put(n) step = [0 for i in range(100001)] vis = [False for i in range(100001)] while not q.empty(): head = q.get() for i in range(3): if i == 0: end = head + 1 elif i == 1: end = head - 1 elif i == 2: end = head * 2 if vis[end]: continue vis[end] = True step[end] = step[head] + 1 if end == k: print(step[end]) return q.put(end)
main
if __name__ == '__main__': a, b = map(int, input().split()) BFS(a, b)