一题多玩,Python花式求解开门寻宝游戏

文摘   2024-05-10 10:51   山东  
董付国老师Python系列教材(累计印刷超过200次)推荐与选用参考
开学第一课:一定不要这样问老师Python问题
3000道Python习题免费在线练习
“Python小屋”1300篇历史文章分类速查表
董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材1:董付国编著,《Python数据分析、挖掘与可视化 (慕课版 第2版)》,ISBN:978-7-115-62634-9,定价59.8元,2024年1月出版(第1版累计印刷11次,已退出历史舞台),配套慕课“Python数据分析与数据可视化”被评为智慧树精品课程,人民邮电出版社“优秀作译者”


图书内容:Python快速入门,NumPy数组与矩阵运算,Pandas数据分析实战,sklearn机器学习实战,Matplotlib数据可视化实战

配套慕课:智慧树网搜索“董付国”,书中二维码也可以看微课

页数:254

适用专业:计算机、数据科学、统计、管理

适用层次:研究生/本科/专科

适用学时:48/64

样书申请:https://www.ryjiaoyu.com/book/details/50017

================

推荐教材2:董付国著,《Python程序设计与数据采集(微课版)》,ISBN:978-7-115-61183-3,人民邮电出版社,2023年5月出版,2023年9月第2次印刷,定价59.8元

配套资源:教学大纲、电子教案、课件、源码、数据文件、章节习题及答案、25小时微课、在线练习与考试系统

样书申请:https://www.ryjiaoyu.com/book/details/45732

=============
问题描述:
小明参加一个游戏,面前从左向右有若干个门,最右边一个门里面是宝藏,前面的每个门打开后会看到一个数字,这个数字表示玩家最多可以向右跨越几个门,例如3表示玩家可以在右边的第1、2、3这三个门中选择一个打开,1表示只能选择打开下一个门,0表示掉进陷阱不能再移动(游戏失败)。
(1)使用回溯法求解所有路径
核心思路:
从下标0出发,尝试所有可能的下一步选择,对于每个选择都尝试再下一步的所有可能选择,重复这个过程。到达目的地或者无法继续行走时回退一步继续尝试其他选择,尝试所有可能的路径并记录经过的位置,如果某条路径最终到达最后一个门就标记为一个有效路径。
例如,以列表[5, 4, 3, 2, 2, 0, 3]为例,从下标0出发的下一步可以到达下标1、2、3、4、5这五个位置,假设下一步选择了下标1那么再下一步可以到达下标2、3、4、5,假设下一步选择了下标2那么再下一步可以到达下标3、4、5,假设下一步选择了下标3那么再下一步可以到达下标4、5,假设下一步选择了下标4那么再下一步可以到达下标5、6,假设下一步选择了下标5结果该位置的数字为0表示掉入陷阱无法移动,于是回退一步回到下标4,重新选择下标6发现到达终点,标记为一条有效路径。然后再回退到下标4的位置发现从该位置出发的路径都走完了,于是再回退一步回到下标3的位置尝试其他选择,...一直到所有路径都走一遍为止。这个过程类似于遍历下图所示的多叉树,该图中每个节点中逗号前面为下标编号,逗号后面为该节点的值(也就是最多可以向右移动几个门)。最终找到的有效路径有(0, 1, 2, 3, 4, 6)、(0, 1, 2, 4, 6)、(0, 1, 3, 4, 6)、(0, 1, 4, 6)、(0, 2, 3, 4, 6)、(0, 2, 4, 6)、(0, 3, 4, 6)、(0, 4, 6),也就是图中红色节点表示的路径。

参考代码1:

运行结果1:

下面的代码也是回溯法的思路,具体实现略有区别,首先把列表转换为字典,相当于一个有向图的邻接表,然后再利用图论算法来寻找有向图中的路径。
参考代码2:

运行结果:

(2)使用贪心算法求解
核心思路:
每次都向右移动尽可能多的距离,如果无法到达终点就提示“无法跳到最后一个位置”。仍以[5, 4, 3, 2, 2, 0, 3]为例,使用贪心算法时从第1个门直接跳到第6个门掉入陷阱无法移动,游戏失败。如果门后数字分别为[5, 4, 3, 2, 2, 2, 3],从第1个门跳到第6个门,从第6个门跳到第7个门,成功。


参考代码:

运行结果:

(3)使用动态规划算法求解
使用动态规划算法求解开门寻宝游戏,要求跳跃次数最少,如果有多个解的话返回门编号最小的跳跃方式。
参考代码:

运行结果:

使用动态规划算法求解开门寻宝游戏,要求跳跃次数最少,如果有多个解的话返回门编号最大的跳跃方式。
参考代码:

运行结果:

=================
温馨提示:
关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和776道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

Python小屋
17本Python系列教材作者董付国老师的小屋,介绍Python语法基础、标准库、扩展库以及在各领域的应用。
 最新文章