惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
罗磊的独立博客
小众软件
小众软件
I
InfoQ
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
MyScale Blog
MyScale Blog
博客园 - 聂微东
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
博客园 - 司徒正美
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
N
Netflix TechBlog - Medium

博客园 - StudyNLP

python把中文汉字转拼音,存储到excel表格 算法结束篇 贪心-钓鱼问题 贪心-放置雷达 贪心-Stall Reservations 贪心-电影节 贪心-圣诞老人的礼物 广度优先搜索-八数码问题 广度优先搜索-鸣人和佐助 广度优先搜索-迷宫问题 深度优先搜索-生日蛋糕 深度优先搜索-Roads 深度优先搜索-踩方格 深度优先搜索-城堡问题 动态规划-分蛋糕V2 动态规划-分蛋糕V1 动态规划-滑雪 动态规划-0-1背包问题 动态规划-神奇的口袋V2
广度优先搜索-抓住那头牛
StudyNLP · 2020-07-15 · via 博客园 - StudyNLP
抓住那头牛(百练习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()