阵型绘画或克隆问题
阵型模式的绘画或克隆题,也是重大考试中经常出现的主题,如下图:
![]()
都是近年来出现在蓝桥杯或等考题中的题型。
这些阵型图包括:正方形,等腰三角形,倒三角形,菱形等造型。有的需要通过克隆(或图章)角色来形成,有的是通过画笔来画出。
对于这类题,我们解决思路是:
1、决定起始位置(通常是左上角的坐标);
2、找出图形的规律(包括图形的形状、行缩进、行间距、列间距等变量)。
我们以下图为例,来给出三角形的阵型图:
![]()
其中,小黄球是一个角色。
为便于编写程序,我们可以定义以下变量:
![]()
能过双重循环来实现整个过程,外层循环控制行数(Y轴方向),内层循环控制列数(X轴方向,每行的元素个数)。
每完成一行后,调整行道位置即可,示例代码如下:
![]()
这类题本身难度不大,往往结合其他问题来构成一个整体,但因为涉及到到的变量的应用、双重循环等,所以,也是考试中经常出现的题型。如:
第15届蓝桥青少省赛Scratch初级组第3题:画西瓜
第15届蓝桥青少省赛Scratch中级组第5题:妖怪矩阵
第14届蓝桥杯Scratch图形化编程国赛中级组第6题:太空大战
子串匹配问题
例(第15届蓝桥青少省赛Scratch中级组第6题:截取递增数):
给你一个不含 0的九位数,请找出从这个九位数中能截取出的所有递增数。例如:115367482能够截取出的递增数有:15、36、 67、367、48。注意:只能截取若干个连续的数。
所谓递增数,即,如果一个大于9的正整数各个数位上的数,从左到右是逐渐变大的,那么就称这个数为递增数。例如:124、248 是递增数。
相似的问题,还包括:
截取递减数: 从左到右严格递减
波峰数(或波谷数):即一个数的中间数字同时大于(波峰)或小于(波谷)左右相邻数字,如:
波峰数:142(4是峰),253(5是峰)
波谷数:354(5是谷),131(3是谷)
回文子串(对称数):即一个子串正读反读相同;
奇偶交替数等。
这些题的特点是:要求从一个长串数字中截取连续的子串,并筛选满足特定条件(如递增、递减、回文等)的子序列。
通常,这类题的解法是:
1、枚举法(穷举法)
也就是枚举出长序列中所有的子串,找出符合要求的子串,其一般步骤为(以上面的截取递增数为例):
a. 遍历所有可能的连续子串
从九位数中截取长度为2到9的所有连续子串(因为递增数必须>9,最小长度为2)。
示例:数字115367482
长度为2的子串:11, 15, 53, 36, 67, 74, 48, 82
长度为3的子串:115, 153, 536, 367, 674, 748, 482
...(直到长度为9的整个数)。
b. 检查子串是否为递增数( 从左到右依次比较相邻数字)
c. 输出符合条件的子串(保存到列表中)
在编程时,我们可以设置内外两重循环,如:
外层循环i:遍历子串长度(1到8),内层循环j:遍历起始位置(i+1,9)。
截取子串后,可通过一个子过程(自定义积木)判断子串是否递增,若满足条件,加入递增数列表,示例如下(非完整代码):
![]()
2、 滑动窗口法
如图:
![]()
我们可以定义两个指针变量(left ,righ),分 别标记子串的左右边界,遍历数字时,动态扩展窗口,仅检查连续递增的序列,如果不再递增,则更新变量的值,判断下一个起始位置,如:
初始时,left=1, right=2,若数字[right] > 数字[right-1],则right右移,扩展窗口。
否则,记录当前窗口的递增子串,并重置left,right变量。
此方法的核心思想,就是一边遍历时一边判断,避免无效截取,所以,方法也更做优。
除了对数字子串的判断外, 我们同样遇到对字符串的判断,如:
例: 查找所有不重复的子串(第15届蓝桥杯Scratch选拔赛第2次STEMA测评5第题:不重复的子串)
题目是:字符串为abbcd,所有子串有:a、ab、abb、abbc、abbcd、b、bb、bbc、bbcd、 bc、 bcd、c、cd、d
其中,子母不重复的子串有:a、ab、b、bc、bcd、c、cd、d
过程类似,找出不重复的子串包括二个过程:
通过枚举找出所有的子串;
除掉所有有重复字母的子串。
![]()
同样是一个遍历 所有可能的子串的问题。其本思路就是: 遍历从当前起始位置开始的所有子串:使用一个内层循环,从每个起始位置开始,作为子串的开始位置,遍历每个字符直到字符串的结尾
同学们可以通过多写程序,来验证代码,以掌握此类问题的一般解法。
递归
去年的递归是道画图题:
![]()
即: 编写出可以画出各级别的科赫雪花的代码。 是道难度不小的应用递归思路的编程题。
7月5日,第1次复赛,同样出一道递归的绘图题,如图: ![]()
即:递归实现谢尔宾斯基地毯。
递归思路,通常包含两个部分:终止条件和递归调用。终止条件,即存在不再调用自身的条件,用于防止无限递归;递归调用则是函数调用自身,以逐步解决问题。
那么,除了上面的题型外,可以关注递归的一些其他应用:
1、 用递归的思路来解决阶乘问题,可以进行如下定义:
n!=(n-1)!× n
示例代码如下:
![]()
2、 斐波那契数列的递归生成
斐波那契数列的前两项是1,从第三项开始,每项的值都是前两项之和,如:1,1,2,3,5,8,13,21,34,55,89,144......
其递归表达式为:
F(n) = F(n-1) + F(n-2) (n≥3)
其中初始值 F(1)=1,F(2)=1
原文可看:
3、递归画树
![]()
如上图,绘制一棵圣诞树:
我们将圣诞树简化一下(如下图),即:每一个棵树的树枝其实也是一棵圣诞树,然后,树枝的树枝仍是一棵圣诞树……
![]()
同样的思路, 还有二叉树, 二叉树是只有二个树枝的树,同时,每个树枝又是一颗二叉树。
注意,树型递归是个很好题材(考试)!
排序。
对于学习计算机编程的同学来说,排序是最基本的入门算法,也是常考的题型。个人认为,小高组的同学掌握二种排序算法还是必要的。
建议熟练掌握选择排序与冒泡排序两个排序算法。选择排序从前往后依次有序,冒泡排序从后往前依次有序。
选择排序的核心思想是从未排序序列中找出最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。重复此过程,直到所有元素均排序完毕。
冒泡排序通过重复地遍历要排序的列表,比较相邻的两个元素,如果顺序错误就交换它们的位置。每一轮遍历会将当前未排序部分的最大元素“冒泡”到正确的位置。
以下是选择排序代码:
![]()
画笔
1、【Scratch艺术画笔】画正多边形
2、【Scratch艺术画笔】画圆、圆弧和扇形
3、【Scratch艺术画笔】画五角星
4、【Scratch艺术画笔】正多边形的旋转
5、【Scratch艺术画笔】画实体正多边形
6、【Scratch艺术画笔】转动的图形一(大风车)
7、【Scratch艺术画笔】转动的图形二(太极阴阳图)
8、【Scratch艺术画笔】转动的图形三(内旋多边形)
9、【Scratch艺术画笔】转动的图形四(外旋多边形)
10、【Scratch艺术画笔】转动的图形五(整体旋转)
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.