Python广度优先搜索BFS - 蓝桥13届省赛污染海域

一、题目描述

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
样例输出


二、程序实现

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)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值