这道题来自2023年5月第14届蓝桥杯省赛Scratch图形化编程中级组真题。
通过编程创作一个消除字母游戏:首先我们会有一张字母表(里面包含了从字母A-Z所有26个大写英文字母);当玩家输入一个字母后,小猫将此字母和它的前两项与后两项字母说出并展示,然后从字母表中删除这五个字母。列表第1项的前1项是列表的最后1项,列表最后1项的后1项是列表的第1项。例如当输入字母C后,小猫先会说出删除字母“ABCDE”,然后列表中删除ABCDE这五个字母;再例如当输入F的时候,由于原先已经删除了ABCDE,所以这次删除的字母便是“YZFGH”;如果输入了一个字母不存在字母表中或者输入的字母已经被我们所删除,那么便会提示输入错误字样;最终当字母表中的字母不足5个的时候,程序结束(图1)。
01
知识点分析
本题重点考察的是列表的知识和算法的理解。尤其是对列表的增加、查找和删除的操作与运用这个知识点。我们需要将26个英文字母插入到列表中。一般有两种方式,第一种可以通过“将东西加入到列表”指令实现依次将从A到Z的26个字母插入到列表中;第二种通过定义字符串,将值设置为26个字母,通过循环和字符串操作的方式提取出单个字符然后插入到列表中。
第二个知识点是如何删除相连的5个字母,这里的难点是如何处理临界点的字母。可能你对这个概念还有点模糊,这里的难点在于:我们需要根据字母所在的位置考虑删除的方法,为了表述方便我使用序号来表示当前字母在列表中的位置。
第一种:当2
第二种:当序号等于1的时候,我们需要删除列表最后两项和列表的前三项(若我们输入的字母是A,那么删除的就是A和YZ及BC)。
第三种:当序号等于2的时候,我们需要删除列表的最后一项和列表的前4项(若我们输入的字母是B,那么删除的就是B和ZA及CD)。
第四种:当序号等于列表的长度时候,删除列表的最后3项和列表的前2项(若我们输入的字母是X,那么删除的便是X和AB及YZ)。
第五种:当序号等于列表长度-1时候,删除列表的最后4项,和列表的第一项(若我们输入的字母是Y,那么便删除Y和WX及ZA)。
看完上述的五种情况,不知道你是否对解题思路有了一些的想法。这里再提醒一下,一旦我们删除列表中的某一项,后面的列表项都会向前移动,利用这个特性我们可以让代码写起来更加地轻松简单。
02
解题思路
这里可以给大家提供一种简单的思路:当用户输入一个字母的时候,我们先找到连续的5个字母,将其保存到一个列表中(可以称之为临时列表)然后再从字母表中找到相应的临时列表中的字母进行删除。
根据上面的分析我们开始编写代码,我们大致分为三个步骤来完成程序。
1.初始化字母表
首先我们创建一个列表,将其命名为字母表,再创建一个变量字母字符串,将其设置初始值ABCDEFGHIJKLMNOPQRSTUVWXYZ然后使用循环,将每个字符依次取出并存到列表中。我们使用自制积木“初始化字母表”来实现列表的初始化(图2)。
2.连续查找前后字母
接下来我们需要查找前后连续的字母。根据上述的思路分析,当用户输入一个字母的时候,先搜索前面两位,将其保存到一张临时的表。如果向前查找字母时刚好遇到了列表的第一项(即“上一项=0”),此时需要将其设置为列表的最后一项(将“上一项”设为“字母表的项目数”)。
然后将用户输入的字母也加入临时列表中。
同理,在查找后一项的时候,如果遇到了列表的最后一项(下一项=列表项目数+1),需要将其设置为列表的第一项(将“下一项”设为1)。
这里我们还需要注意一点,查找到的前两项我们需要注意一下他们的顺序,这个顺序是颠倒的,我们需要进行一个微调,这里使用一个交换法(图3)。
3.删除字母
获取临时列表,在字母表中找到临时列表的第1项的编号并删除。同时将临时列表的第1项也删除。这样重复5次即可(图4)。
本题作为中级组的大题,题目难度不小,知识点也挺多,包括列表的插入、查找、删除,循环等简单算法的思想。同时真正的难点在于如何处理五种不同的情况,所以后续再遇到类似题目时候,大家先分情况进行讨论,一步步处理,再进行编程实现。
编辑|张毅
审核|吴新
领取专属 10元无门槛券
私享最新 技术干货