【蓝桥杯省赛真题42】python独立海域 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录

python独立海域

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、程序说明

五、运行结果

六、考点分析

七、 推荐资料

1、蓝桥杯比赛

2、考级资料

3、其它资料


python独立海域

第十三届蓝桥杯青少年组python省赛真题

一、题目要求

(注:input()输入函数的括号中不允许添加任何信息)

1、编程实现

有一片海域划分为N“M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。请问这片N'M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N*M以外的海域都为已被污染的海域)

例如:N=4,M=5,4*5的海域中,已被污染海域和没被污染的海域如下图:

这块4*5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。

2、输入输出

输入描述:第一行输入两个正整数N和M,N表示矩阵方格的行,M表示矩阵方格的列,N和M之间以一个英文逗号隔开
第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)

输出描述:只有一行,输出一个整数,表示N"M的海域中有几块是没被污染的独立海域

输入样例:

4,5
1,1,0,0,0
1,0,1,0,0
1,0,0,0,0
1,1,0,1,1

输出样例:

3

二、算法分析

  1. 题目是要搜索二维矩阵中所有1是否有连城一片的独立数量
  2. 关键是如何搜索表示是独立的海域
  3. 题目告知是上下左右都没有相连的,也就是找到上下左右数字是0的就没有相连
  4. 可以通过dfs深度搜索或者bfs广度搜索进行实现
  5. 下面采用深度搜索的实现方式:从第一个点开始逐个遍历,判断当前这个点是否是陆地
  6. 如果是就向当前点的上下左右四个点继续调用深搜dfs方法
  7. 如果超出边界或者当前点的值为0就回退

三、程序编写

n,m = map(int,input().split(','))
ls = []
for i in range(n):
    ls.append(list(map(int,input().split(','))))

def dfs(i,j):
    #如果行或者列超出边界,或者格子是0或者访问过
    if (i<0 or i==n) or (j<0 or j==m) or ls[i][j]==0:
        return;
    ls[i][j] = 0    #访问过
    dfs(i-1,j)
    dfs(i+1,j)
    dfs(i,j-1)
    dfs(i,j+1)
    
count = 0
for i in range(n):
    for j in range(m):
        if ls[i][j] == 1:#是陆地
            count += 1
            dfs(i,j)
print(count)

四、程序说明

  1. 首先,通过输入函数获取输入的行数和列数,并将其分别赋值给变量n和m
  2. 然后,使用一个循环,将输入的二维列表逐行添加到变量ls中
  3. 接下来,定义了一个名为dfs的递归函数,用于判断给定坐标的格子是否是连通的陆地
  4. 如果坐标超出边界,或者格子是0(海洋)或者已经访问过,则直接返回
  5. 否则,标记该格子为已访问,并递归判断上、下、左、右四个方向的格子是否是连通的陆地
  6. 初始化变量count为0,用于统计陆地数量
  7. 接下来,通过两个嵌套的循环遍历二维列表中的每个格子。如果该格子的值为1(陆地),则将count加1,并调用dfs函数判断该陆地的连通情况
  8. 最后,输出count,即连通陆地的数量。

五、运行结果

4,5
1,1,0,0,0
1,0,1,0,0
1,0,0,0,0
1,1,0,1,1

3

六、考点分析

难度级别:难,这题相对而言还是有一定小难度,难在算法设计,具体主要考查如下:

  1. 学会分析题目,找到解题思路
  2. 学会DFS或者BFS算法知识的应用
  3. input函数:Python 中 input() 函数接受一个标准输入数据,返回为 string 类型。
  4. int函数:强制将传入对象转换成整数类型
  5. split函数:按照指定的分隔符进行分割
  6. map函数:将指定的对象按照指定的函数进行迭代,在这里是将时分秒字符串类型数据按int整数类型数字返回输出(相当于多个变量强制类型转化)
  7. list函数:强制将参数转化成列表对象
  8. 学会列表的相关操作:列表声明、取数、遍历等等
  9. 学会for循环的使用:for循环可以遍历任何有序的项及列表元素等等。
  10. range函数:rang(a,b),循环的时候是不包括b的,所以我们这个案例中要转变一下,要想包含b,就应该写成range(a,b+1)
  11. 学会if...条件判断语句的使用:满足条件才执行相应的程序
  12. print函数:用于打印输出,最常见的一个函数。
  13. 充分掌握算法相关知识、for循环和列表相关操作函数的使用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

七、 推荐资料

  • 所有考级比赛学习相关资料合集【推荐收藏】

1、蓝桥杯比赛

  • 蓝桥杯python选拔赛真题详解

  • 蓝桥杯python省赛真题详解

  • 蓝桥杯python国赛真题详解

  • 历届蓝桥杯科技素养计算思维真题解析

2、考级资料

  • python等级一级真题解析【电子学会】

  • python等级二级真题解析【电子学会】

  • python等级三级真题解析【电子学会】

  • python等级四级真题解析【电子学会】

3、其它资料

  • 初学python100例

  • 历届蓝桥杯scratch国赛真题解析
  • 历届蓝桥杯scratch省赛真题解析
  • 历届蓝桥杯scratch STEMA选拔赛真题解析
  • 历届蓝桥杯科技素养计算思维真题解析
  • 画图-scratch编程考级99图
  • 电子学会历年scratch等级考试一级真题解析
  • 电子学会历年scratch等级考试二级真题解析
  • 电子学会历年scratch等级考试三级真题解析
  • 电子学会历年scratch等级考试四级真题解析
  • 零基础学习scratch3.0【入门教学 免费】
  • 零基础学习scratch3.0【视频教程 114节 免费】
上一篇:FORM调用标准APARGLFA界面


下一篇:【漏洞复现】号卡极团管理系统 index.php SQL注入漏洞