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

相关推荐
量化分析码农1 小时前
【Python量化趋势跟踪实战 02】突破买入总被假突破坑:通道系统与入场时机
python
Agent世界1 小时前
多平台登录态巡检:cookie 判据为什么会撒谎
python
量化分析码农2 小时前
【Python量化趋势跟踪实战 01】均线多头排列就是趋势开始吗:过滤与确认
python
用户298698530142 小时前
Python 实战:把代码写入 Word 文档的两种实现方式
后端·python·api
小小张说故事2 小时前
Python 里 pickle 到底存了什么:拆开 __reduce__、__getstate__ 和那串能执行代码的字节码
python
reasonsummer2 小时前
【教学类-150-03】20261108蝴蝶连连看html(一页2个版面、3个版面)
python·html
用户019027581612 小时前
用 Polars 快速分析 A 股 K 线:比 pandas 更快的列式处理
python
用户0332126663672 小时前
使用 Python 轻松加密或解密 Excel 文档
python·excel
CyrusYiVPP3 小时前
手写 MCP Server:给问答机器人接上本地文件工具,Python 实战第 13 期
人工智能·python
特立独行的猫A4 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python