图论之岛屿数量(python)

复制代码
#岛屿数量
from typing import List

def numIsLand(grid:List[List[str]])->int:
    cnt=0
    rows=len(grid)
    cols=len(grid[0])
    visited=[[False]*cols for _ in range(rows)]
    direction=[0,1,0,-1,1,0,-1,0]
    def dfs(i,j):  #用于从该点进行扩散
        if i<0 or i>=rows or j<0 or j>=cols or grid[i][j]!='1' or visited[i][j]==True:  #不符合条件不扩散
            return
        visited[i][j]=True  #标记该点为已访问
        for k in range(0,8,2):  #访问它的上下左右
            next_x=i+direction[k]
            next_y=j+direction[k+1]
            dfs(next_x,next_y)  #递归扩散
    for i in range(rows):
        for j in range(cols):
            if grid[i][j]=='1' and visited[i][j]==False:  #找到岛屿入口
                cnt+=1  #岛屿数量加一
                dfs(i,j)  #递归找与该点相邻的陆地
    return cnt  
    
def main():
    grid = grid = [
  ['1','1','0','0','0'],
  ['1','1','0','0','0'],
  ['0','0','1','0','0'],
  ['0','0','0','1','1']
]

    res=numIsLand(grid)
    print(res)
if __name__=="__main__":
        main()

思路:可用DFS求解

1.找到岛屿入口:遍历每一个点,仅当当前点为1(即陆地),且未访问过时,说明找到了一块陆地,陆地数量加一,然后以此点进行扩散(上下左右扩散,斜对角元素不扩散),使用DFS递归进行扩散,将与该点相连的所有陆地全部标记为已访问。

2.扩散到某一点时,先判断,如果越界或者已访问或者不是陆地,则直接返回。

3.如果没有越界,没有访问,且为陆地,则将该点标记为已访问,然后再去递归访问它的相邻点(上下左右),

相关推荐
weixin_580614006 分钟前
MySQL存储过程中如何防止SQL注入_使用参数化查询规范
jvm·数据库·python
2401_837163897 分钟前
PHP源码开发用台式机还是笔记本更合适_硬件选型对比【方法】
jvm·数据库·python
baidu_3409988222 分钟前
mysql修改列名会导致程序报错吗_Change Column语法与兼容性
jvm·数据库·python
xiaohe0730 分钟前
超详细 Python 爬虫指南
开发语言·爬虫·python
Bruceoxl30 分钟前
【人物传记】Python 之父-吉多·范罗苏姆
python·计算机·人物传记
NotFound4861 小时前
实战分享Python爬虫,如何实现高效解析 Web of Science 文献数据并导出 CSV
前端·爬虫·python
23471021271 小时前
4.14 学习笔记
笔记·python·学习
STLearner1 小时前
WSDM 2026 | 时空数据(Spatial Temporal)论文总结
人工智能·python·深度学习·机器学习·数据挖掘·智慧城市·推荐算法
a9511416421 小时前
如何加固SQL集群防注入_实施网络层访问控制策略
jvm·数据库·python
xiaotao1311 小时前
01-编程基础与数学基石:Python错误与异常处理
开发语言·人工智能·python