【题⽬描述】
:
(
注
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)