[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第17讲。
全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信息素养大赛”赛事之一,由中国电子学会主办,包含很多赛项,大赛自2013年举办,已连续成功举办八届,已正式入围“2022-2025学年面向中小学生的全国性竞赛活动名单”。
大赛旨在激发广大青少年的科学兴趣和想象力,培养钻研探究、创新创造的科学精神和实践能力,促进青少年科技创新活动的广泛开展,发现和培养一批具有科研潜质和创新精神的青少年科技创新后备人才。
大赛主要竞赛类别包括电子科技、智能机器人、软件编程三类,全国青少年Python编程挑战赛就属于其中的软件编程类。
一.赛事说明
2023年(第9届)Python挑战赛赛程分为初赛、复赛和总决赛三个阶段。初赛是资格赛,复赛是地方选拔赛,总决赛是全国各地选拔的精英汇聚在一起进行PK。
本届Python挑战赛是在线上举行,参赛选手登录大赛官网在指定页面完成答题并提交答案。评定成绩的依据是同时考虑得分和用时两个方面,首先是得分高者名次靠前,如果得分一样,则用时少者名次靠前。
2023年全国青少年Python编程挑战赛华南赛区(海南)复赛于2023年7月8日正式举行。采取的仍然是在线考试,一共有6道题,全是编程题,考试时间是90分钟。
今天超平老师分享的是第5题,玩石头游戏。
二.题目描述
题目背景:
你和你的朋友,两个人一起玩石头游戏:桌子上有一堆石头。你们轮流进行自己的回合,你作为先手,每一回合,轮到的人拿掉1-3块石头。拿掉最后一块石头的人就是获胜者,假设你们每一步都是最优解。
现在一共有n块石头,请判断你是否可以赢得游戏如果可以赢,输出win;否则,输出lose。
时间限制:1000ms
内存限制:256MB
输入描述:
输入一行一个正整数n,表示石头的个数。
输出描述:
如果可以赢,输出win;否则,输出lose
样例1:
输入:
4
输出:
lose
三.思路分析
这是一个典型的必胜策略问题,那什么是必胜策略问题呢?
我国民间一直流传着一个名叫“抢十八”的数学游戏:参与游戏的两人从1开始轮流报数,每人每次可报一个数或两个连续的数,谁先报到18,谁就获胜。
例如,甲报“1”,乙报“2、3”;接着甲报“4、5”,乙报“6”(或6、7);……,谁报到“18”这个数,说明他抢到了18,就获胜。
本题中描述的玩石头游戏场景和这个如出一辙,对于n块石头,谁拿到最后一块石头,谁就获胜。
怎样才能在游戏中有必胜的可能呢?其中的秘诀又是什么呢?
首先,我们要清楚一点,对于必胜策略游戏,又可以分成如下两种:
-
先取必胜
-
后取必胜
本题的场景属于第一种,即先取必胜,最常用的解决思路是使用倒推法,假设n = 10,即一共有10块石头。
如果你要取第10块石头,那么就需要把7、8、9、10留给对方来取。
由于每人一次都可以取1 ~ 3块石头,如果对方取7,你可以取8、9、10,获胜,如果对方取7、8,你可以取9、10,仍然获胜,如果对方取7、8、9,你就可以取10,依然获胜。
此时意味着你需要拿到第6块石头,同理,你需要把3、4、5、6留给对方来取。
继续倒推,如果要把3、4、5、6留给对方,那么你需要拿到第2块石头,在这个过程中,出现了一系列的致胜点,如图:
所以,你只要先拿掉第1块石头和第2块石头,在对方拿x( 1<= x <= 3)块石头后,你则拿 4 - x块石头,就可以确保获胜。
聪明的你,应该已经发现了,这里有周期现象,周期是几呢?
周期就等于每次可以取到石头的最大数量加上最小数量,即 3 + 1 = 4,而致胜点就是每一个周期的最后一个位置。
再来看一种情况,如果n = 12,即一共有12块石头,会出现什么情况呢。
根据上面的倒推思路,可以找到你的致胜点有4、8、12,如图:
但是,由于你最多只能拿掉3块石头,因此作为先手的你,是无法拿到第一个致胜点4的,所以你是无法获胜的。
看到这里,你应该明白该怎么判断谁输谁赢了吧,其实只需要判断n是否为4的倍数,如果是,你是输家,如果不是4的倍数,你就是赢家。
接下来,我们进入具体的编程实现环节。
四.编程实现
根据上面的思路分析,只需要使用取模运算即可,完整代码如下:
代码比较简单,关键在于对原理的理解。
五.总结与思考
本题难度代码比较简单,考查的知识点主要包括:
-
处理输入数据;
-
if...else双分支语句;
-
取模运算符;
如果题目改为判断n是否为4的倍数,相信每个同学都可以快速写出程序,但是当切换到必胜策略游戏场景中,很多同学就无从下手了,这是为什么呢?
本题的难点在于对于题目的理解和分析,它考察的是孩子的逻辑分析能力和数学思维。这是小学3、4年级学生的题目,不过通常出现在数学思维或者奥数的教程中。
所以,超平老师经常强调,学习编程并不只是学习写代码这么简单,更多的是培养孩子的逻辑思维、数学思维和计算思维。
比如本题中的必胜策略,需要运用逻辑思维来进行推理,找到其中的规律,然后使用数学思维和数学知识来建立数学模型,最后借助编程来实现自动判断,这是3种思维的完美结合。
超平老师再给你留一道思考题:
有15枚棋子,甲乙两人轮流取,规定甲先取,每人每次至少取1枚,最多取2枚。如果谁取走最后一枚棋子谁输,那么谁有必胜策略?必胜策略是什么?
你还有什么巧妙的解决方案吗,欢迎和超平老师交流。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
更多教程,可以移步至“超平的编程课”gzh。