【python】P1451 求细胞数量dfs算法——详细注释

本文题目链接

https://www.luogu.com.cn/problem/P1451

本文参考博客连接

http://t.csdn.cn/yQPm9
版权声明:本文为CSDN博主「u010969626」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010969626/article/details/106183339

求细胞数量

题目描述

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

输入格式

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

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

输出格式

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

样例 #1

样例输入 #1

4 10
0234500067
1034560500
2045600671
0000000089

样例输出 #1

4

提示

数据规模与约定

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

本文题解代码

n,m=map(int,input().split())#n行m列
doub=[[] for i in range(n)]
ans=0
for i in range(n):
    for j in input():
        if j=="0":
            doub[i].append(0)
        else:
            doub[i].append(1)
#将数据全部读入进去
#print(doub)
dirction=((0,1),(0,-1),(-1,0),(1,0))#上下左右

temp=[[0 for i in range(m)] for j in range(n)]#判断条件,全部为0,如果某个位置走过,那么值就为1
def dfs(x,y):
    """
    深度有限,找到一个点合适后,根据这个点进一步找下一个点。
    下文中递归,找到一个点合适,就根据这个点继续找合适的点,根据合适点的一层层向下延伸
    """
    for t in range(4):
        xx=x+dirction[t][0]#上下左右新的x的坐标
        yy=y+dirction[t][1]#上下左右新的y的坐标
        if 0<=xx<n and 0<=yy<m and temp[xx][yy]==0 and doub[xx][yy]!=0:
            """
            上下左右坐标均在范围之内。因为索引初始值为0,所以可以大于等于0,必须小于n,如果等于n则超出范围。
            注意判断这个位置应该是细胞,并且没有被走过
            """
            temp[xx][yy]=1#标记这个位置被走过
            dfs(xx,yy)#递归,将一连串的数字拎出来

for i in range(n):
    for j in range(m):
        if doub[i][j]!=0 and temp[i][j]==0:
            temp[i][j]=1#这里将原点记录在案
            dfs(i,j)#这里将附属的点记录在案
            ans+=1

print(ans)

本文参考了大佬的代码,大佬的代码没有注释着实有些难以理解,我又看了三四个小时才看懂qwq
本文是在较为理解了的基础上对大佬的代码加上了一些注释,帮助大家可以更好的理解。大家还有哪里不清楚,我们可以一起学习。

你可能感兴趣的:(python,深度优先,算法)