报数游戏-第12届蓝桥杯选拔赛Python真题精选

news2024/9/23 17:22:15

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

报数游戏,本题是2020年8月23日举办的第12届蓝桥杯青少组Python编程选拔赛真题。题目要求编程实现报数游戏,n个人围成一圈,从第一个人开始从1报道3,报3的人退出圈子,直到最后一个人游戏结束,计算出最后留下的是原来的第几号。

先来看看题目的要求吧。

一.题目说明

编程实现:

有n个人围成一个圈,按顺序排好号。然后从第一个人开始报数(从1到3报数),报到3的人退出圈子,然后继续从1到3报数,直到最后留下一个人游戏结束,问最后留下的是原来第几号。

输入描述:

输入一个正整数n

输出描述:

输出最后留下的是原来的第几号

样例输入:

5

样例输出:

4

评分标准:

  • 3分:能正确输出一组数据

  • 5分:能正确输出两组数据;

  • 7分:能正确输出三组数据;

  • 10分:能正确输出四组数据。

二.思路分析

这是一道经典的约瑟夫环问题,有多种不同的解决方案,涉及的知识点也有所不同,但基本上都会用到列表和循环。

据说著名犹太历史学家Josephus经历过这样的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人宁愿死也不想被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。

然而Josephus和他的朋友并不想遵从,于是就先假装遵从,Josephus将朋友与自己安排在第16个与第31个位置。这样当所有犹太人全部自杀后,他和他的朋友就逃过了这场死亡游戏。

这个故事可以看作是约瑟夫问题的由来,通常描述为:N个人围成一圈,第一个人从1开始依次进行报数,当报到M时将该人杀掉。然后从被杀掉的下一个人开始,重新从1继续报数,直到只剩下最后一个人,试问最终存活下来的人是谁?

图片

为了帮助你更好的理解这个过程,我们假定有6个人排队,从第一个人开始报数,每次数到2的人出列,初始情况如图所示:

图片

从第一个人开始报数,Person1报1,Person2报2,因此Person2出列,如图:

图片

接下来Person3又从1开始报数,Person4报2,因此Person4出列,如图:

图片

然后Person5继续从1开始报数,Person6报2,因此Person6出列,如图:

图片

转了一圈,又回到Person1了,Person1报1,Person3报2,因此Person3出列,如图:

图片

最后轮到Person5报1了,Person1报2,因此Person1出列,如图:

图片

因此,最后的胜利者是Person5。

针对约瑟夫问题,常见的解决方案包括列表模拟算法、循环链表法、队列法、递归算法、递推算法和动态规划算法等。

为简单起见,我们先从最简单的模拟算法入手,使用列表保存这n个人的状态,其中1表示在列,0表示已出列,列表项索引则表示每个人的编号(需要加1),如下:

people = [1, 1, 1, 1, 1, 1,...,1]

刚开始所有人在列,每一项都为1,接下来从从头开始遍历列表,模拟报数过程,如下:

1). 如果当前列表项people[i]为1,说明还在列,就报数,如果当前列表项为0,说明已出列,不做任何操作;

2). 每一个在列的人报完数,需要将数字增加1,如果数字为4,则重置为1;

3). 报数时,如果数字为3,则需要出列,只需要将people[i]设置为0即可;

4). 当列表遍历完成后,需要再回到列表头部,重复上述过程;

5). 当列表中只有一项为1时,循环结束。

一旦你理解了列表模拟算法,我们可以借助队列简化这个过程,之所以选择队列,是因为Python在collections标准库中提供了队列容器,使用起来非常方便。

所谓队列,是指一种特殊的列表,其特殊之处在于它只允许队头进行删除操作,通常称为出队,而在队尾进行插入操作,通常称为入队。

图片

像队列这种最先进去的数据最先被取来,即“先进先出”的结构,我们称为First In First Out,简称FIFO。

这和我们日常生活中排队的现象如出一辙,所以称作队列。

图片

队列又分为单向队列(queue)和双端队列(deque),二者的区别就在于前者只能在队头删除和队尾插入,而后者则可以在任何一端进行删除和插入操作,我们要使用的是双端队列。

图片

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

三.编程实现

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

  • 列表模拟算法

  • 队列模拟算法

1. 列表模拟算法

根据前面的思路分析,我们编写代码如下:

图片

代码不多,简单说明3点:

1). 列表提供了count()方法,用于统计指定内容的数量,只要1的数量 > 1,就要继续报数;

2). i表示索引,当i = n时,表示列表已经遍历完了,需要将i重置为0,可以使用取模运算实现,即 i = (i + 1)% n ,当然你也可以使用if...else语句来实现;

3). 最后只有一项为1,通过列表的index()方法,获取其索引,由于列表索引是从0开始的,因此需要加1,才是最后一个人的正确编号。

2. 队列模拟算法

根据前面的思路分析,编写代码如下:

图片

代码比较简单,关键在于理解其过程和各代码的作用,说明如下:

1). 这里的deque是双端队列,支持从两端添加和删除元素。

2). deque()方法用于初始化队列,此处使用了range()函数,得到的队列和列表结构一样,如下:

people = [1, 2, 3, 4, 5, ... , n]

3). 这里的rotate(-1)是关键,它的作用是将队列的队头元素移动到队尾,而其它的元素则相应地向左移动一位。

假设n = 5,初始队列如下:

[1, 2, 3, 4, 5]

第一次调用rotate(-1)方法,将队头的1移到队尾,其它的则左移了一位,如下:

[2, 3, 4, 5, 1]

第二次调用rotate(-1)方法,将队头的2移到队尾,其它的左移一位,如下:

[3, 4, 5, 1, 2]

如此一来,就将需要删除的3移到队头了。

4). for循环的作用就是将每次报到3的元素移到队头,然后使用popleft()函数删除队头元素。

如此重复上述过程,当整个队列只剩下一个元素时,结束循环,这个元素就是最后一个人的编号。

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

四.总结与思考

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

  • 循环语句,包括while循环和for信号;

  • 条件语句及其嵌套用法;

  • 列表的常见方法;

  • 列表推导式的用法;

从知识点的层面上来讲,都是大家比较熟悉的内容,本题的关键在于充分理解报数的过程,理顺其中的逻辑关系,然后使用列表结合循环来模拟这个过程。

当然,如果对循环链表和队列有所了解的话,借助这些数据结构,可以极大地简化代码。

Python中的列表是一种动态数组,支持在列表的任意位置进行插入、删除和访问元素,类似于链表的灵活性。在大部分情况下,Python的列表已经能够满足链表的需求,因此没有提供链表这种数据结构。

队列分为单向队列和双端队列,其区别在于前者只能在队头进行删除操作、在队尾进行插入操作,而后者在队头和队尾都可以进行插入、删除操作。

在Python中,可以使用列表来模拟单向队列,因而collections模块没有提供单向队列的实现。而双端队列支持从两端添加和删除元素的操作的特性使得它在某些算法和数据结构处理中非常灵活和高效,为此,collections模块专门提供了双端队列deque。

当然,除了上面给出的两种解法,还可以使用递归、递推和动态规划等算法来实现,其代码更为简洁,但是理解起来有些难度,超平老师会在后续的教程中专门讲解,敬请期待。

超平老师给你留一道思考题,本题中的3是固定的,如果它也是变化的,不妨用m来表示,又该如何实现呢?

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

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

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

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

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

相关文章

VMware 替代专题 | 浅析 VMware 与 SmartX 超融合 I/O 路径差异及其影响

不同的超融合软件,其读写机制有一定的差异性,I/O 路径也不尽相同,这使得他们在 I/O 读写效率以及资源占用上都有不同的表现。有兴趣着手构建超融合基础架构的用户,可能会希望了解更多关于 I/O 路径的细节,从而在实施之…

智能商品计划系统:鞋服品牌的未来价值引擎

在数字化浪潮席卷全球的今天,智能商品计划系统正成为鞋服品牌转型升级的重要引擎。那么,什么是智能商品计划系统?它又能给鞋服品牌带来怎样的价值?本文将深入探讨这一话题,为鞋服品牌企业指引方向。 智能商品计划系统…

京东云开发者:DDD 学习与感悟 —— 向屎山冲锋

原文地址:https://mp.weixin.qq.com/s/Hvq1ttBopbxypatVcKcLiA 软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此,软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计…

使用QGIS将shp数据导入到数据库

QGIS将shp数据导入到数据库步骤: 1、在QGIS中查看携带地理坐标的数据,可以右键查看数据的属性数据源,可以修改数据使用的编码(防止乱码),如下图 2、选择数据右键Export导出,在导出的页面可以选…

Springboot+vue的高校教师科研管理系统+数据库+报告+免费远程调试

项目介绍: Javaee项目,springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的高校教师科研管理系统,采用M(model)V(view)C(controller)三层体系结构&#xf…

09 事务和连接池

文章目录 properties文件连接池service层实现类dao层实现类dao层实现类 连接池类: 创建线程池静态常量,用于放连接。 创建Properties静态常量,用于解析properties文件 静态代码块中,解析properties文件,将解析结果用于创建连接池 …

innovus中path group 的策略和应用(下)

BPG(basic path group)和PG(path group)的异同 INVS默认使用了BPG,但是基于SDC理论下PG(path group)也是天然存在,两者在数据库里边有各自存在的方式,也可以共融共生中&…

100个openharmony开源demo:1.日历

准备用开发者手机写100个开源的demo不知道能不能实现,日拱一卒,期待蜕变。 第一个demo:日历,借鉴了网上的日历算法,自己用arkts写了界面和点击事件,各位可根据此demo写自己的日历选择器等组件。 1.目录结…

【JAVA笔记】IDEA配置本地Maven

文章目录 1 配置本地Maven1.1 Maven下载1.2 Maven安装与配置1.2.1 安装1.2.2 配置1.2.2.1 环境配置1.2.2.2 本地仓库配置 2 IDEA设置本地Maven 1 配置本地Maven 1.1 Maven下载 官网:http://maven.apache.org/下载地址:http://maven.apache.org/downloa…

SinoDB客户端工具dbaccess

类似Oracle的客户端工具sqlplus,Mysql的客户端工具mysql,SinoDB数据库也有自带的命令行客户端工具dbaccess。 dbaccess 识别用户输入,将用户输入的 SQL 语句打包发送给 SinoDB 数据库服务器执行,然后接收服务器的执行结果&#xf…

windows上打开redis服务闪退问题处理

方法1:在windows上面打开redis服务时,弹窗闪退可能是6379端口占用,可以用以下命令查看: netstat -aon | findstr 6379 如果端口被占用可以用这个命令解决: taskkill /f /pid 进程号 方法2: 可以使用…

Java特性之设计模式【装饰器模式】

一、装饰器模式 概述 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装 装饰器模式通过将对象包装在装饰器类中,以…

数据泄露问题怎么解决?迅软DSE加密软件助您守护重要信息

企业信息泄露的危害 企业数据泄露事件不仅给企业带来了经济损失和声誉损害,还可能导致用户个人信息的泄露,引起社会广泛关注。 因此,企业需要采取更加严格的数据保护措施,使用数据加密系统以防范潜在的数据泄露风险。同时&#…

Vue.js前端开发零基础教学(三)

目录 2.6 计算属性 2.7侦听器 2.8 样式绑定 2.8.1 绑定class属性 2.8.2 绑定style属性 2.9 阶段案例——学习计划表 2.6 计算属性 概念:Vue提供了计算属性来描述依赖响应式数据的复杂逻辑。 计算属性可以实时监听数据的变化,返回一个计算…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板,13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题,标注,未来主义和线条标题,下三分之一,霓虹灯,带数字的标题,倒计时,表格&#xff0c…

智慧商显安卓主板MT8788_联发科MTK平台多媒体广告一体机方案

MT8788高性能智能主板,支持Android 9.0操作系统,支持双屏异显功能;MT8788是基于12nm工艺制程四核A73四核A53架构的八核心CPU,主频高达2.0GHz,拥有超强的通用计算性能。 MT8788主板采用10层二阶超高密度PCB板,集成了4G、百兆以太网、2.4G/5G 双频WiFi、蓝…

C# xaml框架以及Java的ORM介绍

c#有ASP.Net,.NET以及EF Core这几个重要的运行时和框架.分别用于web,应用以及数据库的ORM. 目前跨平台的有Avalonia UI,.Net MAUI以及Uno Platform,至于WPF等本身不是跨平台的,但可以依靠其他库实现跨平台.这里面Avalonia应该是认为bug比较少的. 当然目前最火的跨平台解决方案…

Python使用指定端口进行http请求的例子

使用requests库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class SourcePortAdapter(HTTPAdapter): """"Transport adapter" that allows us to set the source port.""" def __init__(self, port, *args, **kwargs): self.poolm…

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障,导致上层服务故障,并且这个故障不断放大的过程,成为雪崩效应。 雪崩效应,往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池,线程池满…

数据结构的概念大合集06(树和二叉树)

概念大合集06 1、树1.1 树的相关定义1.2 树的基本运算1.3 树的基本术语1.3.1 结点的度,树的度1.3.2 分支结点,叶子节点1.3.3 路径,路径长度1.3.4 孩子结点,双亲结点,兄弟结点1.3.5 结点层次,树的高度1.3.6 …