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

相关推荐
qq_5137280431 分钟前
StaleElementReferenceException(陈旧元素引用异常)
python
千里码aicood36 分钟前
基于Python的电商数据采集系统(大数据+爬虫)
开发语言·python
战略性的菠萝1 小时前
研究生基础-Python快速入门(终)——面向对象
python
陈皮波比茶1 小时前
Python项目实战-网络机器人(爬虫)
开发语言·网络·爬虫·python·机器人
winfredzhang2 小时前
从零构建家庭照片管理系统:Django 模块化单体实战,以及我踩到的 4 个真实坑
python·postgresql·django·sqlite·bootsrap
jyOverQ2 小时前
LangGraph 流式执行详解:stream、astream 与 stream_mode 怎么选?
python·langchain
闲猫2 小时前
LangGraph / Capabilities / Stores
python·agent·langgraph
pjj198542 小时前
机器学习-NumPy2
人工智能·python·机器学习
OPEN-F2 小时前
Python进阶教程:单元测试与代码质量
开发语言·python·单元测试
Logintern093 小时前
装饰器和洋葱模式的区分
开发语言·python·架构