寻找小码的路 | 「青训营 X 码上掘金」主题创作

简介: 寻找小码的路 | 「青训营 X 码上掘金」主题创作

前言

能加入到这届的青训营我十分的开心,更希望自己不仅能通过这次的青训营之旅丰富自己的阅历之余,还能够认识到更多的学习伙伴。最后通过快乐写码分享讲解我创作灵感和过程的同时,也希望大家可以及时纠正我的错误,伴我学习。

任务介绍

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

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

任务分析

通过对题目的解读,不难看出这是一个求从起点N到终点K的最短路径的问题,可以使用宽度优先搜索算法BFS进行解题。

宽度优先搜索算法的搜索步骤一般是:

(1)从队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个新结点。

(2)检查新生成的结点,看它是否已在队列中存在,如果新结点已经在队列中出现过,就放弃这个结点,然后回到第(1)步。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。

(3)检查新结点是否目标结点。如果新结点是目标结点,则搜索成功,程序结束;若新结点不是目标结点,则回到第(1)步,再从队列头取出结点进行扩展。

任务设计

假设小青起点N为节点N,并使用一个双端队列来实现宽度优先搜索算法,接着使用一个set来记录已经访问过的节点,这样就可以避免重复访问已经访问过的节点,由此来提高效率。

在这里,我假设小青和小码的位置关系为 N < K,代码中的边界条件也是基于此假设而设置的。如果你需要处理 N > K 的情况,需要对代码进行相应的修改。

另外,在这个问题中,如果起点和终点之间不存在路径,则返回 -1。

最后,这段代码的复杂度为 O(K),因为只需要遍历K个节点即可找到终点,并且由于使用了set来判重,所以不存在重复便利相同节点的情况。

from collections import deque
def shortest_path(N, K):
    queue = deque([(N, 0)])
    visited = set()
    while queue:
        node, step = queue.popleft()
        if node == K:
            return step
        if node not in visited:
            visited.add(node)
            if node - 1 >= 0:
                queue.append((node - 1, step + 1))
            if node + 1 <= K:
                queue.append((node + 1, step + 1))
            if node * 2 <= K:
                queue.append((node * 2, step + 1))
    return -1
if __name__ == '__main__':
   n, k = map(int, input("请输入小青和小码的位置:").split())
   print("最短时间是:",shortest_path(n, k),"分钟")


总结

通过这次的解题,我认为这道题目也可以使用递归来实现宽度优先搜索算法,每一层的递归可以看作为一层的BFS,但考虑到递归是一种比较耗费时间的算法,对于量较大的数据,可能会导致超时,所以我暂时没用尝试使用递归进行解题。

写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!

最后,希望通过这次的讲解创作灵感和过程,能让掘友们看到对于这个主题的不一样的解法,也希望掘友们可以及时纠正我的错误。


目录
相关文章
|
算法 Linux C语言
【我的创作之路】CSDN陪我走过的256个日夜
【我的创作之路】CSDN陪我走过的256个日夜
163 0
|
6月前
|
开发者
第十一期乘风伯乐活动开启,快来推荐你身边热爱分享的技术达人吧
乘风伯乐奖,面向阿里云开发者社区已入驻乘风者计划的博主(技术/星级/专家),邀请用户入驻乘风者计划即可获得乘风者定制周边等实物奖励。本期面向阿里云开发者社区寻找100位乘风伯乐,邀请人数月度TOP 1 获奖者(大于108人)可获得cherry樱桃MX3.0S键盘及伯乐之星证书!
1954 172
第十一期乘风伯乐活动开启,快来推荐你身边热爱分享的技术达人吧
|
JavaScript 前端开发 小程序
【2023新星计划 】博客创作指导 & 活动解读
【2023新星计划 】博客创作指导 & 活动解读
191 0
|
人工智能 Java 大数据
CSDN:2020年度CSDN博客之星评选竞赛——180号【一个处女座的程序猿】,感谢您,投上的宝贵一票,感谢!感恩!
CSDN:2020年度CSDN博客之星评选竞赛——180号【一个处女座的程序猿】,感谢您,投上的宝贵一票,感谢!感恩!
CSDN:2020年度CSDN博客之星评选竞赛——180号【一个处女座的程序猿】,感谢您,投上的宝贵一票,感谢!感恩!
|
PyTorch API 数据处理
一学就会!快来查收这份 MMPose 学习指南
对于 MMPose 我是慕名已久,一直以来跟不少做 Pose 的大佬交流时也常常提起,说同样的模型用 MMPose 跑出来点数会高不少,然而 MM 系列的封装逻辑和学习门槛让我一再搁置,终于最近才下定决心要把它啃下来。 本系列将记录我第一次接触 MMPose 系列的学习轨迹,学习思路,以及过程中的一些心得体会。
1284 0
一学就会!快来查收这份 MMPose 学习指南
|
程序员 图形学 芯片
掘金收割机的年终总结,我用 Three.js 创建了一个"掘金城市" | 2021年终总结征文
我叫大帅,一个老程序猿。本文会在评论中抽一个幸运鹅获得掘金周边鼠标垫1份
292 0
掘金收割机的年终总结,我用 Three.js 创建了一个"掘金城市" | 2021年终总结征文
|
SQL 分布式计算 前端开发
长路漫漫,其修远兮,这一年我与CSDN的故事 | 2021年终总结
长路漫漫,其修远兮,这一年我与CSDN的故事 | 2021年终总结
183 0
长路漫漫,其修远兮,这一年我与CSDN的故事 | 2021年终总结
|
安全 大数据 程序员
聚能聊每周精选 第十四期
1.数据安全话题其实已经是老生常谈,随着大数据时代的到来,数据和敏感信息问题越来越多,同时也越来越被个人、企业乃至国家所重视。2.程序员的工作和日常生活非常的枯燥,但强烈的好奇心和学习精神是一个程序员的秘密武器,它是程序员们永攀高峰的源泉和动力所在。
3190 0
聚能聊每周精选 第十四期
|
大数据 分布式数据库 数据库
云栖专辑 | 阿里开发者们的20个感悟,一通百通
2018年12月20日,云栖社区3岁。阿里巴巴常说“晴天修屋顶”,所以我们特别制作了这个专辑——分享给开发者们20个阿里故事,50本书籍。
267703 0