13届蓝桥杯省赛-python:第10题孤岛问题

【题⽬描述】 :
( input0 输⼊函数的括号中不允许添加任何信息 )  
【编程实现】 :
有⼀⽚海域划分为N*M个⽅格,其中有些海域已被污染(⽤0表示),有些海域没被污染(⽤1表示)。
请问这⽚N*M海域中有⼏块是没被污染的独⽴海域(没被污染的独⽴海域是指该块海域上下左右被已污染的海域包围,且N*M以外的海域都为已被污染的海域)
例如:N=4,M=5,4*5的海域中已被污染海域和没被污染的海域如下图:

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

【输⼊描述】:

第⼀⾏输⼊两个正整数N和M,N表示矩阵⽅格的⾏,M表示矩阵⽅格的列,N和M之间以⼀个英⽂逗号隔开,第⼆⾏开始输⼊N⾏,每⾏M个数字 (数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)

【输出描述】:

输出⼀个整数,表示N*M的海域中有⼏块是没被污染的独⽴海域。

解题思路:

将输入存为二维列表, 遍历整个二维列表, 如果当前元素为 1, 则证明它必然是某个孤岛的一部分,进行DFS,将相邻的 1 都变成 0,并将孤独数量 + 1, 直至遍历完整个列表。

为什么将相邻的 1 都变成 0:防止重复统计相同的孤岛

代码:

n, m = eval(input())
lst = []
for i in range(n):
    lst.append(list(eval(input())))
print(lst)

def dfs(lst, i, j):
    if i < 0 or i > n-1 or j < 0 or j > m-1 or lst[i][j] == 0:
        return
    else:
        lst[i][j] = 0    # 将相邻的岛设置为污染的海水 0
        dfs(lst, i+1, j) # 检查上下左右的海域,使用递归向四周扩散检查
        dfs(lst, i-1, j)
        dfs(lst, i, j+1)
        dfs(lst, i, j-1)
n = 4
m = 5
lst = [[1, 1, 0, 0, 0],
       [1, 0, 1, 0, 0],
       [1, 0, 0, 0, 0],
       [1, 1, 0, 1, 1]]

island = 0
for i in range(n):
    for j in range(m):
        if lst[i][j] == 1:  # 只要是1 那么其必然为一个岛
            island += 1
            dfs(lst, i, j)  # 深度搜索此岛的区域
print(island)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值