独立农作物区域-第13届蓝桥杯省赛Python真题精选

news2024/11/18 19:47:48

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

独立农作物区域,本题是2022年4月17日举办的第13届蓝桥杯青少组Python编程省赛真题编程部分第6题,13届一共举办了两次省赛,这是第一次省赛。题目要求对于被划分为N x M块的农田,编程计算出有几块独立的农作物区域。

先来看看题目的要求吧。

一.题目说明

编程实现:

有一块农田被划分为N × M块,农作物和杂草分布生长在农田中,其中农作物使用大写字母R表示,杂草使用大写字母X表示。

请计算出农田中有几块独立的农作物区域(独立的农作物区域指该区域上下左右都被杂草围住,且N × M以外的区域都是杂草)。

例如:N = 4 , M = 4 , 4 × 4的农田中农作物和杂草分布如下图,这块4 × 4的农田中有3块独立的农作物区域(红色的3部分)。

图片

输入描述:

第一行输入两个整数N和M(1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ),N表示农田的行数,M表示农田的列数,且两个正整数之间以一个英文逗号隔开。

接下来的N行每行包括M个字符(字符只能为R或X),R表示农作物,X表示杂草,字符之间以一个英文逗号隔开。

输出描述:

输出一个整数,表示N × M的农田中有几块独立的农作物区域。

输入样例:

4, 4

R, R, R, X

R, X, R, X

X, X, X, R

R, X, X, X

输出样例:

3

二.思路分析

这是一道经典的算法题,涉及的知识点包括循环、条件、二维列表、枚举算法、递归和DFS算法等。

这其实是一个经典的岛屿问题,什么是岛屿问题呢?

图片

对于本题中所描述的调整规则,如何保证调整次数最少呢,这其中又有什么规律和奥妙呢?

岛屿问题是一类与图、矩阵等数据结构相关的计算机科学问题,通常涉及在由1和0组成的二维矩阵中寻找连接在一起的'1'(代表陆地)形成的岛屿的数量、面积或其他特征。

岛屿问题的典型场景是给定一个二维矩阵,其中1表示陆地,0表示水域,岛屿是由水平和垂直连接的陆地格子组成的。

图片

岛屿问题通常可以细分为以下几类:

  • 计算岛屿数量:给定一个二维矩阵,计算其中岛屿的数量,即由'1'组成的相连区域的个数。

  • 计算岛屿面积:在给定的二维矩阵中,计算每个岛屿的面积是多少,即由'1'组成的区域的格子数。

  • 最大岛屿面积:在二维网格上找到最大的岛屿,即具有最大面积的岛屿。

  • 判断岛屿边界:判断岛屿的周围是否有水域,即判断岛屿的边界情况。

本题描述的场景,就是第一种,只不过这里用R表示农作物,X表示杂草,要计算的是农作物区域的数量,其本质是一样的。

解决岛屿问题,通常会使用如下3种经典算法:

  • 深度优先搜索(DFS):通过深度优先搜索算法遍历二维网格中的每个格子,对未访问的陆地格子进行深度优先搜索,以识别形成的岛屿。

  • 广度优先搜索(BFS):使用广度优先搜索算法,从陆地格子开始向外层扩展,以识别和计算岛屿。

  • 并查集(Union Find):使用并查集数据结构来表示不同区域的连接情况,以组织和计算岛屿数量。

其中,DFS算法相对更简单和直观,理解起来也比较容易,对于初学者来说是最佳选择,所以,超平老师将重点介绍DFS算法的实现方法。

DFS,即深度优先搜索,是Depth First Search的简写,它是一种用于遍历或搜索树或图的算法,早在19世纪就被用于解决迷宫问题。

图片

DFS算法的核心思想是尽可能深地探索图的分支,直到无法继续为止,然后回溯并探索其他分支,在代码层面,主要是通过递归来实现。

为了更好地理解DFS过程,我们举例来说明,以第一个单元格grid[0][0]为例,如下:

图片

grid[0][0] = "R",生长的是农作物,说明找到了一块农作物区域,因此我们需要将它周围的农作物单元格都找出来。

这就需要沿着4个方向进行搜索,如下:

  • 左:左边没有单元格了,直接返回;

  • 上:上面也没有单元格了,直接返回;

  • 右:右边的单元格是农作物R,就以同样的方式递归处理;

  • 下:下边的单元格是农作物R,以同样的方式递归处理;

先处理右方grid[0][1],它也需要向上下左右4个方向进行搜索,如图:

图片

这时会遇到一个非常棘手的问题,它左边的单元格grid[0][0]已经处理过了,如果再向左搜索,就会陷入死循环。

因此,我们在处理grid[0][0]时,就需要将其变成X,也就是常说的淹掉(或者感染),如图:

图片

对于单元格grid[0][1],继续沿着4个方向进行搜索,如下:

  • 左:左边的单元格是草地X,直接返回;

  • 上:上面也没有单元格了,直接返回;

  • 右:右边的单元格是农作物R,以同样的方式递归处理;

  • 下:下边的单元格是草地X,直接返回;

同时,将当前单元格grid[0][1]也变成草地X,然后递归处理右边的单元格grid[0][2],如图:

图片

仍然沿着4个方向进行搜索,如下:

  • 左:左边的单元格是草地X,直接返回;

  • 上:上面也没有单元格了,直接返回;

  • 右:右边的单元格是草地X,直接返回;

  • 下:下边的单元格是农作物R,以同样的方式递归处理;

将当前单元格grid[0][2]淹掉,变成草地X,然后再递归处理下边的单元格grid[1][2],如图:

图片

还是沿着4个方向进行搜索,此时四周全都是草地X,直接返回,同时将当前单元格grid[1][2]淹掉,变成草地X。

然后再回到grid[0][0],处理它下方的单元格grid[1][0],如图:

图片

对于grid[1][0]来说,左边没有单元格,其它3个方向都是草地X,直接返回,同时将当前单元格grid[1][0]淹掉,变成草地X,如图:

图片

如此一来,第一块农作物区域就处理完了,然后再以同样的方式来处理其他的农作物区域。

注意,在处理每一个单元格的时候,都需要沿着4个方向进行搜索,对于每个方向,都会重复同样的操作,一搜到底,颇有点不到黄河心不死的味道,这就是DFS算法的精髓。

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

三.编程实现

根据上面的思路分析,我们分两步编写程序:

  • 定义DFS函数

  • 统计农作物区域数量

1. 定义DFS函数

根据前面的思路分析,定义DFS函数如下:

图片

代码不多,强调3点:

1). 要彻底理解DFS函数的真实含义,它的作用是对于二维表格中的单元格(i, j),如果是农作物区域(字符为R),则将和它连在一起的所有单元格都变成杂草区域(字符为X),这就是所谓淹掉函数(感染函数)的含义;

2). 对于给定的i和j,需要考虑两个特殊情况,一是越界了,二是当前区域是杂草,它们是递归函数的出口,两个条件的顺序很重要,不能颠倒,否则会出现越界错误,也可以合并为一个条件,如下:

if i < 0 or i >= row or j < 0 or j >= col or grid[i][j] == 'X'

3). 一旦发现当前单元格是农作物(R),那么就将其淹掉,变成杂草(X),然后通过递归,将一整片农作物区域都变成杂草,从而避免重复处理,陷入死循环。

2. 统计农作物区域数量

有了DFS函数,就可以按照从上到下、从左到右的顺序遍历每一个单元格,代码如下:

图片

代码不算多,说明两点:

1). grid是一个n x m的二维列表,先通过循环获取输入的n行字符;

2). 统计农作物区域时,需要遍历每一个单元格,如果当前区域是农作物,就说明找到了一块农作物区域,将cnt增加1,然后调用dfs函数将这一片农作物都淹掉,变成杂草。

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

四.总结与思考

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

  • 循环语句;

  • 条件语句;

  • 二维列表;

  • 枚举算法;

  • 递归函数;

  • DFS算法;

作为本次测评的最后一题,本题代码不少,难度也比较大。关键点有两个,一是对递归函数的理解和运用,二是对DFS函数的深入理解。

递归是一种强大的机制,它本身就能够帮我们做很多事情,我们只需要确定两点,一是如何进行递归,二是递归的结束条件。

对于岛屿问题,递归是向上下左右4个方向进行的,结束条件也非常简单,就是一旦越界,立刻结束。

DFS函数是本题的重点,我们不能仅仅停留在具体的代码层面,而是要将其抽象出来,深入理解其作用。

为了更好的理解,建议大家多使用淹掉函数(或感染函数)来描述,形象生动,便于理解。

实际上,所有岛屿问题的解决方法都是类似的,而DFS函数是解决这类问题的关键。因此,一定要深入理解并掌握DFS函数的定义及使用。

岛屿问题不仅在计算机科学领域中常见,还在地理信息系统、图像分析、游戏开发等领域有着广泛的应用。

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

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

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

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

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

相关文章

食品企业仓储式批发零售一体化解决方案

食品企业需要有效应对日益复杂的市场挑战和消费者需求的快速变化的挑战并提升市场竞争力&#xff0c;仓储式类的批发零售一体化需求应运而生。这一全新的商业模式不仅整合了传统的批发和零售模式&#xff0c;还优化了供应链管理和客户体验&#xff0c;成为食品行业发展的新引擎…

docker安装Jumpserver

docker安装Jumpserver 简介 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。 JumpServer 堡垒机帮助企业以更安全的方式管控和登录各种类型的资产&#xff0c;包括&#xff1a; SSH: Linux / Unix / 网络设备 等&#xff1b; Windows:…

中科数安 |-透明加密软件_无感透明加密 - 源头有保障

中科数安的透明加密软件是一款专为保护企业数据安全而设计的高级产品&#xff0c;它采用了无感透明加密技术&#xff0c;确保源头数据的安全可靠。 ——www.weaem.com 以下是该软件的主要特点和功能概述&#xff1a; 无感透明加密&#xff1a; 中科数安的透明加密软件能够在用…

分类预测 | Matlab实现GA-XGBoost遗传算法优化XGBoost的多特征分类预测

分类预测 | Matlab实现GA-XGBoost遗传算法优化XGBoost的多特征分类预测 目录 分类预测 | Matlab实现GA-XGBoost遗传算法优化XGBoost的多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GA-XGBoost遗传算法优化XGBoost的多特征分类预测&#xff0c;…

Spring Boot集成Minio插件快速入门

1 Minio介绍 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&…

【机器学习300问】125、什么是双向循环神经网络(BRNN)?什么是深度循环神经网络(DRNN)?

一、双向循环神经网络 &#xff08;1&#xff09;诞生背景 双向循环神经网络&#xff08;Bidirectional Recurrenct Neural Network, BRNN&#xff09;是在深度学习领域发展起来的一种特殊类型的循环神经网络&#xff08;RNN&#xff09;&#xff0c;它诞生的背景是为了解决传…

抽卡机小程序:设计与开发全攻略

在移动互联网时代&#xff0c;小程序以其轻便、易用、无需安装的特点&#xff0c;迅速成为用户日常使用的重要工具。其中&#xff0c;抽卡机小程序因其独特的娱乐性和互动性&#xff0c;受到广大用户的喜爱。本文将为大家详细介绍抽卡机小程序的设计与开发全攻略。 一、需求分析…

电子竞赛5——作息时间控制器

一 . 题目要求 用单片机制作作息时间控制器&#xff1b;用四位数码管显示实时时钟&#xff08;时、分&#xff0c;24小时制、12小时制&#xff09;&#xff0c;有秒闪&#xff0c;小时十位有零消隐&#xff1b;可用数字键或、-键校时&#xff08;可快速、-&#xff09;被校位&…

通过OOS定时升级EIP实例临时带宽

目录 功能背景 关键特性 应用场景 使用限制 操作步骤 附录 执行流程图 模板 功能背景 随着业务的不断发展和互联网应用场景的多样化&#xff0c;企业或个人用户在特定时间段内面临网络流量剧增的挑战变得尤为常见。这些流量高峰&#xff0c;如大规模促销活动、热门直播…

[递归与栈]The Sierpinski Fractal

描述 Consider a regular triangular area, divide it into four equal triangles of half height and remove the one in the middle. Apply the same operation recursively to each of the three remaining triangles. If we repeated this procedure infinite times, wed …

我劝你别惹“女”项目经理

她来了她来了&#xff0c;她带着项目进度走来了&#xff01;&#xff01;&#xff01; 在职场的江湖里&#xff0c;流传着一个传说&#xff0c;那便是“女”项目经理的神话。她们&#xff0c;是团队中的“铁娘子”&#xff0c;是项目里的“指挥官”&#xff0c;更是无数人心中的…

商城小程序:颠覆传统电商,打造全新商业生态

在数字化浪潮的推动下&#xff0c;网购行业呈现多元化繁荣发展态势&#xff0c;出现了琳琅满目的商品应用小程序&#xff0c;但市面上的商城小程序基本属于通用型&#xff0c;无论是商城界面展示和基本功能&#xff0c;都不能满足个性化和商品推广需求&#xff0c;阻碍了商品的…

故障记录---docker僵死

故障现象&#xff1a; docker进程僵死&#xff0c;docker命令无法使用 处理过程&#xff1a; 查看docker进程状态&#xff0c;显示句柄数过多&#xff0c;于是重启了docker [rootdata02 opt]# systemctl status docker ● docker.service - Docker Application Container Eng…

这13个常用电路基础公式,每一位电子工程师都要牢记

计算电阻电路中电流、电压、电阻和功率之间的关系。 欧姆定律解释了电压、电流和电阻之间的关系&#xff0c;即通过导体两点间的电流与这两点间的电势差成正比。说明两点间的电压差、流经该两点的电流和该电流路径电阻之间关系的定律。该定律的数学表达式为V IR&#xff0c;其中…

Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口

前言 本篇文章我们来使用 Supabase 实现 RESTful 风格的 API 接口&#xff0c;以此来实现网站分类和子站点的 CURD 功能。 表设计 这里需要用到两张表&#xff1a; ds_categorys&#xff1a;存储网站分类 列名类型备注iduuid主键&#xff0c;分类 idnametext分类名称desct…

重学java 76.JDK新特性 ② 函数式接口

Looking to the future is the order of the day, no worrying about old news —— 24.6.19 一、函数式接口 1.定义 有且只有一个抽象方法的接口 2.检测 FunctionalInterface 3.示例 FunctionalInterface public interface USB {void open(String s); }public class Demo3…

【碳排放控排1006】碳排放控排企业名单数据集,探索绿色生产!

今天给大家分享的是国内顶级期刊2023发表论文《碳排放规制、企业减排激励与全要素生产率——基于中国碳排放权交易机制的准自然实验》中使用到的重要数据集——碳排放控排企业名单&#xff0c;该论文从企业生产效率视角对论文进行研究&#xff0c;发现碳排放权交易机制显著提升…

红米手机RedNot11无法使用谷歌框架,打开游戏闪退的问题,红米手机如何开启谷歌框架

红米手机RedNot11无法使用谷歌框架&#xff0c;打开游戏闪退的问题&#xff0c; 1.问题描述2.问题原因3.解决方案3.1配置谷歌框架&#xff1a;3.1软件优化 4.附图 1.问题描述 红米手机打开安卓APP没有广告&#xff0c;直接闪退&#xff0c;无法使用谷歌框架 异常关键词中包含&…

人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总)

开源大语言模型完整列表 Large Language Model (LLM) 即大规模语言模型&#xff0c;是一种基于深度学习的自然语言处理模型&#xff0c;它能够学习到自然语言的语法和语义&#xff0c;从而可以生成人类可读的文本。 所谓"语言模型"&#xff0c;就是只用来处理语言文…

数字时代的创新:二人共益订单模式解析

一、引言 随着数字技术的飞速发展&#xff0c;商业模式也日新月异。其中&#xff0c;“二人共益订单模式”凭借其独特的互助与共赢理念&#xff0c;迅速在市场中获得关注。该模式不仅为用户提供了优质服务和独享优惠&#xff0c;更通过用户间的互助和订单共享&#xff0c;实现…