zoukankan      html  css  js  c++  java
  • 广度优先搜索-抓住那头牛

    抓住那头牛(百练习4001):农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上
    ,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
    1、从X移动到X-1或X+1,每次移动花费一分钟
    2、从X移动到2*X,每次移动花费一分钟
    假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

    广度优先搜索:给节点分层。起点是第0层。从起点最少需n步就能到达的点属于第n层。
    依层次顺序,从小到大扩展节点。把层次低的点全部扩展出来后,才会扩展层次高的点。
    可确保找到最优解,但是因扩展出来的节点较多,且多数节点都需要保存,因此
    需要的存储空间较大。用队列存节点。
    样例输入
    5 17
    样例输出
    4

    python 算法实现:
     1 import queue
     2 
     3 MAXN = 100000
     4 # 判重标记, visited[i] = true表示i已经扩展过
     5 visited = [0 for i in range(MAXN + 10)]
     6 
     7 
     8 class Step:
     9     # x-位置,steps-到达x所需的步数
    10     x = 0
    11     steps = 0
    12 
    13     def __init__(self, p1, p2):
    14         self.x = p1
    15         self.steps = p2
    16 
    17 
    18 def main():
    19     global visited, MAXN
    20     N, K = map(int, input().split())
    21     startLocation = Step(N, 0)
    22     # 声明一个队列对象
    23     q = queue.Queue()
    24     # 初始位置Step对象插入队列
    25     q.put(startLocation)
    26     visited[N] = 1
    27     while not q.empty():
    28         # 获取元素后会出列
    29         s = q.get()
    30         # 找到目标
    31         if s.x == K:
    32             print("农夫最少要花%d分钟才能抓住牛" % s.steps)
    33             return 0
    34         else:
    35             if s.x - 1 >= 0 and visited[s.x-1] == 0:
    36                 q.put(Step(s.x - 1, s.steps + 1))
    37                 visited[s.x - 1] = 1
    38             if s.x + 1 <= MAXN and visited[s.x+1] == 0:
    39                 q.put(Step(s.x + 1, s.steps + 1))
    40                 visited[s.x + 1] = 1
    41             if s.x * 2 <= MAXN and visited[s.x*2] == 0:
    42                 q.put(Step(s.x * 2, s.steps + 1))
    43                 visited[s.x * 2] = 1
    44 
    45     return 0
    46 
    47 
    48 if __name__ == '__main__':
    49     main()


  • 相关阅读:
    优秀的云架构师需要学什么技能
    dkh人力资源大数据解决方案整体架构
    大数据hadoop与spark的区别
    hadoop技术入门学习之发行版选择
    大数据开发基础知识需要掌握哪些
    智慧人社政务云平台建设方案架构案例介绍
    [项目机会]citrix 虚拟桌面对于java等高CPU占用率如何解决
    [办公自动化]无法使用江南天安usbkey 无法使用视频网站
    [学习笔记]从0到1
    [办公自动化]目录修改以及插入分页符后行间距自动变宽
  • 原文地址:https://www.cnblogs.com/an-wl/p/13307395.html
Copyright © 2011-2022 走看看