密室逃脱游戏-第12届蓝桥杯省赛Python真题精选

news2024/11/24 13:49:15

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第58讲。

密室逃脱游戏,本题是2021年4月24日举办的第12届蓝桥杯青少组Python编程省赛真题,第12届一共有两场省赛,这是第二场。题目要求计算在100间密室中,按照游戏规则进入M号密室有多少种路线方案。

先来看看题目的要求吧。

一.题目说明

提示信息:

有一个密室逃脱游戏,有100间密室连在一排。密室编号是从1开始连续排列一直排到第100间密室,如下图:

图片

游戏规则:

1. 玩家初始位置在1号密室;

2. 每次玩家可以进入右边的一个密室,也可以跳过一个密室进入下个密室(如:当玩家当前在3号密室,他可以进入4号密室也可以进入5号密室);

3. 有毒气的密室不能进入需要避开。

编程实现:

给定三个正整数X,Y,M(X < Y < M ≤ 100),表示三个密室编号,X号密室和Y号密室有毒气泄漏,不能进入,玩家需要进入到M号密室。按照游戏规则进入M号密室有多少种路线方案。

例如:X = 2,Y = 4,M = 7,进入M号密室有2种路线方案,分别是1->3->5->6->7路线和1->3->5->7路线。

输入描述:

输入三个正整数X,Y,M(X < Y < M),X和Y表示有毒气密室编号,M表示需要进入的密室编号,且三个正整数之间以英文逗号隔开

输出描述:

输出进入M号密室有多少种路线方案

样例输入:

2,4,7

样例输出:

2

二.思路分析

这是一道算法题,考查的知识点涉及循环、递归、列表和斐波那契数列等。

题目所描述的场景看起来是不是有似曾相识的感觉,但是又感觉有点怪怪的?实际上,这就是斐波那契数列(兔子数列)的变种问题,其本质仍然是斐波那契数列。

还记得斐波那契数列的递推公式吗:

图片

针对本题,我们可以运算分解思维将题目需求拆分成两步:

1). 假定没有毒气密室;

2). 增加X和Y两个毒气密室。

如果不考虑毒气密室,这就是我们熟悉的斐波那契数列,我们可以使用f(m)表示进入M号密室的路线数量。

当m = 3时,也就是3号密室,可以从1号密室过来,也可以从2号密室过来,根据加法原理,f(3) = f(1) + f(2)。

对于2号密室,它前面只有1号密室,因此路线数量为1,即f(2) = 1。

对于1号密室,它是玩家的初始位置,应该设置为多少呢?

如果只看1号密室本身,我们可以设置为0,也可以设置为1。但是从3号密室的角度来看,设置为1显然更合适。

所以,递推公式如下所示:

f(m) = 1 当m = 1 或 m = 2时f(m) = f(m - 1) + f(m - 2) 当m > 2时

如下图所示,这是在没有毒气密室时1~8号密室的路线数量:

图片

接下来,我们再增加两个毒气密室X和Y,以题目给的样例数据X = 2,Y = 4,M = 7来说明。

X号密室和Y号密室有毒气泄漏,是不能进入的,这就意味着f(x)和f(y)都为0,即f(2) = f(4) = 0。

所以,在计算f(m)的时候,除了要单独考虑f(1)和f(2)之外,还需要考虑m = x、m = y的情况,如果 m = x 或者 m = y,那么f(m) = 0。

对应的,进入1~8号密室的路线数量如图所示:

图片

这就意味着在计算每个密室的路线数量时,需要判断房间号是否为x或y,递推公式如下:​​​​​​​

f(m) = 0  当m = x 或 m = yf(m) = 1  当m = 1 或 m = 2f(m) = f(m - 1) + f(m - 2) 当m > 2时

针对斐波那契数列问题,通常有如下三种解决方案:

1). 递归

2). 动态规划

3). 迭代

这3种方案,都有一个共同点,那就是都需要用到递推公式。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们分别使用3种方案来编写程序:

  • 递归

  • 动态规划

  • 递推

1. 递归

递归算法的核心是要定义递归函数,递归的3要素如下:

  • 自定义函数,并且带有参数

  • 在函数中调用自己

  • 有结束条件

根据前面思路分析中的递推的公式,编写代码如下:

图片

代码比较简单,这也是递归函数的特点,强调两点:

1). m = x或y的条件,要先于m == 1或2;

2). 在if语句中有return语句,因此不需要使用elif和else,代码更加简洁。

但是,这个代码是有问题的,如果m比较大的话,会存在超时的情况,你可以测试一下m为100的情况。

为什么会超时呢,原因在于进行了大量重复的计算,比如在计算f(x, y,10)的时候,需要计算f(x, y, 9)和f(x, y, 8),而在计算f(x, y, 9)的时候,需要计算f(x, y, 8)和f(x, y, 7),很显然,f(x, y, 8)计算了两次。

实际上,随着m的增加,计算的次数会以指数的形式增加。能否将这些已经计算过的值保存起来,从而避免重复计算呢。

这就是带备忘录的递归算法,可以增加一个列表,用于保存f(x, y, m)的值。

修改代码如下:

图片

说明两点:

1). 递归函数中增加了一个参数memo,这就是备忘录列表;

2). 将列表的初始值设为-1,然后判断memo[m]的值,如果为-1,则说明是第一次计算,将计算的结果保存到memo列表中。

有了带备忘录的递归算法,时间复杂度将大大降低,效率会得到极大的提升,这是典型的用空间换时间的策略。

2. 动态规划

递归算法是自顶向下的策略,而动态规划则是自底向上的思想,可以从第1项和第2项开始,逐个计算后续的每一项。

动态规划有两个关键点:

  • 定义dp列表

  • 找出推导公式(状态转移方程)

我们可以定义dp[i]表示到i号密室的路线数量,由于列表的下标是从0开始的,为了方便,将dp[0]设为0,表示0号房间,可以理解为是虚拟的一个房间,dp[1]设置为1,表示1号房间,依此类推...

对应的代码如下:

图片

代码也不算多,说明两点:

1). 在计算dp[1]的时候,使用了带条件的赋值语句,这体现了Python的简洁性;

2). 虽然列表有第0项,但它是虚拟的,实际上我们是从第1项开始算的,即下标为1的列表项表示1号密室,因此对于m号密室,就是dp[m]。

3. 递推

仔细分析动态规划中的代码,可以发现在计算dp[i]的时候,实际上只用到了dp[i - 1]和dp[i - 2]。

于是,一些追求完美的同学开始有想法了,能否不用列表呢,这样还可以节省不少空间呢。

确实可以,实际上,我们只需要3个变量就够了,不妨用fm表示当前项,f2表示第m -1项,f1表示第m - 2项。

接下来使用循环从第3项开始,一步一步的计算每一项,这就是递推的算法思想,也叫迭代,对应的代码如下所示:

图片

代码不多,说明两点:

1). 在计算第1项和第2项的时候,需要考虑x和y的取值;

2). 每次在计算好当前项fm的值后,需要重新设置f1和f2,可以理解为f1和f2都右移一位。

至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果啦

四.总结与思考

本题代码在10行左右,涉及到的知识点包括:

  • 循环语句,主要是for...in;

  • 条件语句;

  • 输入处理,尤其是多个数据的输入;

  • 列表的使用;

  • 带条件的赋值语句;

  • 斐波那契数列;

作为本次省赛的倒数第二题,难度较大,难点在于如何找到突破点,将问题拆分成两个小问题,然后逐一解决。

将复杂问题拆分成多个简单问题,进而逐个解决,这是我们在学习编程时要重点培养和训练的一种思维。

任何复杂问题,只要能分解,我们就可以找到解决问题的方法。

号称硅谷钢铁侠的埃隆·马斯克曾经说过:“一个人最大的本事是拥有拆解思维,掌握它,你将活力四射”,由此可见,拆解思维是多么的强大和重要。

斐波那契数列,这是我们学习算法的必备经典问题,本文给出了3种解决方案,分别是递归、动态规划和递推(迭代)。相比较而言,递推算法是最优的,时间复杂度和空间复杂度都是最低的。

当我们彻底理解了斐波那契数列问题,就可以解决一系列相关题目,基本上都是它的变种问题。

超平老师给你留一道思考题,这里给出了动态规划的解决方案,你认为斐波那契数列是一个真正的DP问题吗,为什么呢?

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1648402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

揭秘CDO首席数据官选用机制:企业如何找到最合适的数据领袖?

随着大数据时代的到来&#xff0c;数据已成为企业最宝贵的资源之一。为了有效管理和利用这些数据&#xff0c;越来越多的企业开始设立首席数据官&#xff08;CDO&#xff09;这一职位。首席数据官不仅负责企业数据的战略规划和治理&#xff0c;还要推动数据驱动的业务决策。那么…

性能测试常见风险以及消减措施

性能测试过程中会遇到各种各样的风险&#xff0c;常见风险以及消减措施有哪些&#xff1f; 一&#xff1a; 时间 一&#xff09;时间相关风险 时间相关风险不仅限于最终用户满意度,尽管这是大多数人首先想到的。时间也是某些与业务和数据相关的风险因素。性能测试可以解决的…

【前端】前端数据本地化的多种实现方式及其优劣对比

前端数据本地化的多种实现方式及其优劣对比 在现代Web开发中&#xff0c;提高页面响应速度和改善用户体验是核心目标之一。数据本地化是其中一种实现方式&#xff0c;它通过在客户端存储数据来减少服务器请求&#xff0c;从而加快数据载入速度和改善用户的体验。本文将介绍前端…

【JS】call和 apply函数的详解

JavaScript 中 call() 和 apply() 函数的详解 在JavaScript中&#xff0c;call()和apply()都是非常重要的方法&#xff0c;用于调用函数时指定函数体内的this的值&#xff0c;从而实现不同对象之间的方法共享。尽管它们的功能非常相似&#xff0c;但在实际使用中各有其优势和特…

Jupyter Notebook输入python代码没智能提示

1、在Jupyter中打开控制台 2、再控制台中执行以下两个命令&#xff1a; pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user pip install jupyter_contrib_nbextensions命令需要下载文件&#xff0c;请耐心等待。 3、执行完成后&#xff0…

【正点原子Linux连载】 第四十章 Linux网络驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

天工一刻 | 一文看懂MoE混合专家大模型 | 最新快讯

&#xff08;原标题&#xff1a;天工一刻 | 一文看懂MoE混合专家大模型&#xff09; 随着大模型技术迎来颠覆性突破&#xff0c;新兴AI应用大量涌现&#xff0c;不断重塑着人类、机器与智能的关系。 为此&#xff0c;昆仑万维集团重磅推出《天工一刻》系列产业观察栏目。在本…

Google搜索广告怎么开户?谷歌广告开户投放引流技巧、账户搭建、谷歌ads广告推广投放策略 #搜索引擎 #谷歌广告#互联网营销

Google搜索广告开户步骤&#xff1a; 选择代理商&#xff1a;首先&#xff0c;您需要选择一个经验丰富、信誉良好的Google广告代理商。可以选择上海上弦来广告开户和代运营。 初步咨询&#xff1a;与代理商进行初步沟通&#xff0c;了解他们的服务内容、成功案例、收费标准等。…

翻译《The Old New Thing》- Does Windows have a limit of 2000 threads per process?

Does Windows have a limit of 2000 threads per process? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050729-14/?p34773 Raymond Chen 2005年07月29日 Windows 是否有一个每个进程2000线程的限制&#xff1f; 简要 文章解释了在 W…

一键生成AI数字人短视频工具推荐!

数字人是什么&#xff1f;是利用人工智能技术实现与真人直播形象的1:1克隆&#xff0c;即克隆出一个数字化的你自己&#xff0c;包括你的形象、表情、动作和声音都会被克隆下来&#xff0c;让你能够拥有接近真人的表现力。 怎样使用数字人一天生成上百条短视频&#xff0c;无需…

Java中导入Maven项目

Maven坐标 maven坐标是资源的唯一标识&#xff0c;通过坐标可以唯一定位资源位置 使用坐标来定义项目或引入项目中需要的依赖 Maven坐标的组成 groupId&#xff1a;定义当前Maven项目隶属组织名称&#xff08;通常是域名反写 例如&#xff1a;com.ming&#xff09; artifa…

AI视频教程下载:用ChatGP在24小时内制作发布畅销电子书

这门变革性的课程使您能够利用内容生成和自行出版的新兴AI世界。利用ChatGPT 4等尖端人工智能工具&#xff0c;也称为ChatGPT Plus&#xff0c;您将获得所需的技能集&#xff0c;以创建引人入胜的内容&#xff0c;掌握设计&#xff0c;并成为亚马逊KDP上成功的自行出版作者 。 …

电商技术揭秘三十九:电商智能风控技术架构设计

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序&#xff0c;简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同&#xff0c;并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求&#xff0c;得到如图 7.25 所示的类图。 原…

FreeRTOS任务详解

一、任务的创建与删除 1.任务的基本概念 RTOS系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习 RTOS 系统的工程 师或者学生主要就是为了使用 RTOS 的多任务处理功能,初步上手 RTOS 系统首先必须掌握的 也是任务的创建、删除、挂起和恢复等操作,由此可见任务管理…

Tektronix泰克MSO4054混合信号示波器

泰克MSO4054混合信号示波器是一款功能强大的测量仪器&#xff0c;它集成了数字存储示波器和逻辑分析仪的功能&#xff0c;为工程师提供了全面而精确的信号分析解决方案。在今天的高速电子设备开发中&#xff0c;混合信号示波器已经成为不可或缺的工具&#xff0c;而泰克MSO4054…

集中式抄表是什么?什么叫集中式抄表?

1.集中式抄表&#xff1a;简述 集中式抄表是一种现代化、高效率的电力工程、水力发电或燃气计量方法&#xff0c;它改变了传统的人工抄表方式&#xff0c;完成了远程自动化数据收集。这类系统主要由中央服务器、通信系统及安装在用户端智能化表计构成&#xff0c;大大提高了公…

Sarcasm detection论文解析 |CAT-BiGRU

论文地址 论文地址&#xff1a;CAT-BiGRU: Convolution and Attention with Bi-Directional Gated Recurrent Unit for Self-Deprecating Sarcasm Detection | Cognitive Computation github:Ashraf-Kamal/Self-Deprecating-Sarcasm-Detection (github.com) 论文首页 笔记框架 …

液晶数显式液压万能试验机WES-600D技术方案书

一、简介 主机为四立柱、两丝杠、油缸下置式&#xff0c;拉伸空间位于主机的上方&#xff0c;压缩、弯曲试验空间位于主机下横梁和工作台之间。测力仪表采用高清液晶显示屏&#xff0c;实验数据方便直观。 二、 传动系统 下横梁升降采用电机经减速器、链传动机构、丝杠副传动…