一、题目描述
1.1 题目内容
有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。
请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)
例如:N=4,M=5,4 * 5的海域中,已被污染海域和没被污染的海域如下图:
这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。
1.2 输入描述
第一行输入两个正整数N和M,N表示矩阵方格的行,M表示矩阵方格的列,N和M之间以一个英文逗号隔开;
第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)
1.3 输出描述
输出一个整数,表示N * M的海域中有几块是没被污染的独立海域
1.4 输入/输出参考
样例输入
4,5
1,1,0,0,0
1,0,1,0,0
1,0,0,0,0
1,1,0,1,1
样例输出
3
二、程序实现
2.1 输入部分
n,m=[int(i) for i in input().split(",")]
ls=[]
for i in range(n):
ls.append([int(p) for p in input().split(",")])
2.2.1 递归函数
"1" 不做统计,一片海域只统计为一个1,所以函数功能是清理当前起始点的所有连续"1",避免其它起点统计时被重复统计。
def clean_area(x, y):
ls[x][y] = 0
neigh = [(x+1, y), (x, y-1), (x, y+1)]
for nx, ny in neigh:
if 0 <= nx < n and 0 <= ny < m and ls[nx][ny] == 1:
clean_bfs(nx, ny)
2.2.2 BFS函数实现
因为"1"已经被清理为"0",所以不用使用visit变量统计已访问的路径。
def find_area(x,y,cnt=1):
ls[x][y] = 0
queue = [(x,y)]
while queue:
x, y = queue.pop(0)
for nx, ny in [(x+1, y), (x, y-1), (x, y+1)]:
if 0 <= nx < n and 0 <= ny < m and ls[nx][ny] == 1:
ls[nx][ny] = 0
queue.append((nx,ny))
2.3 调用与输出
cnt = 0
for x in range(n):
for y in range(m):
if ls[x][y] == 1:
cnt += 1
find_area(x,y) # 或 clean_area(x,y)
print(cnt)