图论之岛屿数量(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.如果没有越界,没有访问,且为陆地,则将该点标记为已访问,然后再去递归访问它的相邻点(上下左右),

相关推荐
用户556918817532 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱16 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei18 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi001 天前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 天前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi002 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用