[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第91讲。
先来看看题目的要求吧。
时间限制:3000MS
内存限制:589824K8
编程实现:
有一个N * M的矩阵方格,其中有些方格中有奖品,有些方格中没有奖品。小蓝需要从N * M的矩阵中选择一个正方形区域,如果所选的正方形区域的一条对角线方格中都有奖品,其他方格都没有奖品,就会获得所选区域中的所有奖品,否则不能获得奖品。
当给出N和M的值,及N * M的矩阵方格中摆放的奖品情况
例如:N = 5,M = 6,奖品情况如下:
选择上图红色正方形区域,可以获得最多的4个奖品。
输入描述:
第一行输入两个整数N和M(1 ≤ N ≤ 100,1 ≤ M ≤ 100),N表示矩阵的行数,M表示矩阵的列数,两个整数之间一个空格隔开
接下来输入N行,每行包括M个0或者1(0表示方格中没有奖品,1表示方格中有奖品),0或者1之间一个空格隔开
输出描述:
输出一个整数,表示最多可获得的奖品数
输入样例:
5 6
1 0 1 0 0 0
0 1 0 1 0 0
1 0 0 0 1 0
0 1 0 0 0 1
1 0 1 0 0 0
输出样例:
4
评分标准:
20分:能正确输出一组数据;
20分:能正确输出两组数据;
20分:能正确输出三组数据;
20分:能正确输出四组数据;
20分:能正确输出五组数据。
这是一道涉及二维矩阵遍历的算法题,涉及的知识点包括循环、条件、二维列表、自定义函数、枚举算法和DFS算法等。
思路有了,接下来,我们就进入具体的编程实现环节。
自定义函数
遍历矩阵计算最大值
1. 自定义函数
根据前面的思路分析,我们需要定义3个函数。
a. 计算并判断正方形区域中1的数量
自定义函数如下:
简单说明4点:
1). grid是输入的二维列表,x和y是指正方形对角线的起点,i和j是正方形对角线的终点;
2). 通过i和x来计算正方形的长度;
3). 对于一个正方形区域而言,要取k行k列数据,计算1的个数,grid本身是一个二维列表,只需要计算列的起点和终点,运用切片运算就可以,但是由于存在撇和捺两条对角线,因此需要计算好列起点start和列终点end的值。
4). k是正方形的长度,如果整个正方形区域1的和等于k,说明满足条件,可以获得奖品,返回True,否则返回false。
b. 捺对角线DFS函数
c. 撇对角线DFS函数
代码基本上差不多,强调两点:
1). 在进行DFS搜索时,有3个条件需要判断,一是越界,二是单元格的值不为0,三是所构成的正方形区域中1都在对角线上;
2). 注意这里x,y和i,j的作用和区别,i和j主要用于dfs搜索,而x和y则在计算正方形区域中1的数量时必不可少。
2 遍历矩阵计算最大值
有了上面的3个函数,接下来就好办了,先获取输入的数据,再遍历二维列表,计算并更新最大奖品数即可,具体代码如下:
代码不多,说明3点:
1). 首先需要获取用户输入的数据,将二维列表数据保存到grid中;
2). 对于每个单元格而言,其起点就是i和j,因此需要使用将它们的值分别赋值给x和y;
3). 对于每个单元格,都存在撇和捺两种情况,取二者中的较大值,并不断更新即可。
循环语句;
条件语句;
二维列表;
自定义函数;
DFS算法;
作为本次测评中高级最后一题,本题分值为100分,代码量较多,难度较大。关键点有两个,一是深入理解题目的意思,找到问题的规律和特点,二是通过自定义函数来简化代码。
二维列表是编程中常见的数据结构,对二维列表的遍历是学习编程的基本功,除了最简单的横向遍历和纵向遍历之外,还包括斜线遍历和螺旋遍历等,一定要多加练习,做到灵活运用。
超平老师给你留一道思考题,本题可以使用动态规划来实现吗,如果可以的话,代码该如何编写呢?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
需要源码的,可以添加本人微信。
另外,超平老师创建了一个蓝桥杯备考交流群,这是专门为老师和家长打造的免费社群,您可以与来自全国各地的老师、家长共同交流经验,分享学习心得。
超平老师也会给大家带来及时的赛事动态,备考攻略,真题资源分享,帮助各位更好地备考第15届蓝桥杯赛事,力争取得优异的成绩。
扫码或长按加入微信群