python算法题——搜索篇 Poj3278

抓住那头牛

描述

农夫约翰被告知一头逃跑的奶牛的位置,想立即抓住她。他从数字线上的点 N(0 ≤ N ≤ 100,000)开始,母牛在同一数字线上的点 K (0 ≤ K ≤ 100,000)。 农夫约翰有两种交通工具:步行和传送。

步行:FJ可以在一分钟内 从任何点X移动到点X-1或X + 1传送:FJ可以在一分钟内从任何点X移动到2× X

如果这头牛不知道它的追逐,根本不动,农夫约翰需要多长时间才能取回它?

输入

第 1 行:两个空格分隔的整数:NK

输出

第 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值