【DFS题型七/连通块】P1451 求细胞数量

题目描述

一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

输入格式

第一行两个整数代表矩阵大小 n 和 m。

接下来 n 行,每行一个长度为 m 的只含字符 0 到 9 的字符串,代表这个 n \times mn×m 的矩阵。

输出格式

一行一个整数代表细胞个数。

输入输出样例

输入 #1复制

4 10
0234500067
1034560500
2045600671
0000000089

输出 #1复制

4

说明/提示

数据规模与约定

对于 100\%100% 的数据,保证 1 \le n,m \le 1001≤n,m≤100。

n,m=map(int,input().split())
l=[list(map(int,input())) for i in range(n)]
#print(l)
def dfs(x,y):
    l[x][y]=0
    for (a,b) in [(0,1),(1,0),(-1,0),(0,-1)]:
        x1=x+a
        y1=y+b
        if 0<=x1<n and 0<=y1<m and l[x1][y1]!=0:
            dfs(x1, y1)
    return


sum=0
for i in range(n):
    for j in range(m):
        if l[i][j]!=0:
            dfs(i,j)
            sum+=1
print(sum)
#print(l)

先遍历图的所有值,若不为0则进入bfs进行涂色,

通过bfs将该值周围所有的非零值都改为0(上色)

然后bfs结束对sum进行加一计数

该题有个关键就是上色步骤l[x][y]=0到底在什么时候进行,应是每访问一次就进行涂色,避免边界的非零值无法被上色。

但是不能ac,不知道问题出在哪。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值