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

相关推荐
戴西软件2 小时前
乘用车车门结构侧面碰撞仿真全流程:PreSys + Ansys 实战操作
java·开发语言·python·ui·cae
将冲破艾迪i2 小时前
【AI】部署及调用deepseek和qwen等大模型
人工智能·python·ollama·deepseek
啥咕啦呛2 小时前
跟着AI学Java第1天:Java Lambda与Stream试学包
java·开发语言·python
小周学学学2 小时前
vmware的python自动化:批量克隆虚拟机
运维·服务器·python·自动化·vmware
Ulyanov3 小时前
基于ttk的Python现代化GUI开发指南
开发语言·前端·python·tkinter·系统设计
badhope3 小时前
2026年零基础打造专属AI机器人:从GitHub开源项目到个人智能助手,完整实战指南
人工智能·python·深度学习·计算机视觉·数据挖掘·github·语音识别
coderlin_3 小时前
Django 基础 初识
笔记·python·django
好家伙VCC3 小时前
# Pytest发散创新:从基础测试到智能断言的实战进阶指南在现代软
java·python·pytest
研究点啥好呢3 小时前
3月26日Github热榜推荐 | AI代理工具链专栏
人工智能·驱动开发·python·ai