算法第五十一天:图论part02(第十一章)

1.岛屿数量

99. 岛屿数量

🌟 思路总结 — DFS 版

1️⃣ 问题本质

  • 给定一个二维矩阵 grid,1 表示陆地,0 表示水

  • 统计岛屿数量,每个岛屿由上下左右相邻的陆地组成

本质是 在二维网格中找连通块 的问题。


2️⃣ 核心思路

  1. 遍历矩阵

    • 对每个格子 (i,j)

      • 如果是陆地 (grid[i][j] == 1) 且未访问过
        → 说明发现一个新岛屿,岛屿计数 +1

  2. DFS 扩展岛屿

    • 从新发现的陆地出发,深度优先递归访问上下左右相邻的陆地

    • 每访问一个陆地就标记为已访问 visited[i][j] = True

    • 递归结束后,这块岛屿的所有陆地都被标记,避免重复计数

  3. 返回岛屿数量

    • 遍历完矩阵后,岛屿计数就是答案


3️⃣ 核心技巧

  1. 方向数组

 

direction = [[0,1],[1,0],[0,-1],[-1,0]] # 右、下、左、上

  • 遍历邻居时统一处理

  • next_x = x + dx, next_y = y + dy

  1. 访问标记

  • visited 二维布尔数组标记已访问的陆地

  • DFS 或 BFS 入队/递归时立即标记,防止重复访问

  1. 越界判断

 

if nextx < 0 or nextx >= n or nexty < 0 or nexty >= m: continue

  • 避免访问矩阵外的元素

#深度优先
direction = [[0, 1], [1, 0], [-1, 0], [0, -1]]  #依次是右,下, 上, 左
def dfs(grid, visited, x, y):for i, j in direction:nextx = x + inexty = y + j#判断是否越界if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continue# 如果是陆地且未访问if grid[nextx][nexty] == 1 and visited[nextx][nexty] == False:visited[nextx][nexty] = Truedfs(grid, visited, nextx, nexty)def main():#输入,存图n, m = map(int, input().split())grid = []for i in range(n):grid.append(list(map(int, input().split())))visited = [[False] * m for _ in range(n)]result = 0for i in range(n):for j in range(m):if grid[i][j] == 1 and visited[i][j] == False:result += 1visited[i][j] = True#dfsdfs(grid, visited, i, j)return resultif __name__ == "__main__":print(main())

2.广度优先搜索的理论基础

步骤:先将起点加入队列, 标记为true, 取出当前节点,沿四个方向遍历判断是否访问过,未访问则加入队列,标记为true。直至队列为空则广搜结束

direction = [[0,1], [1, 0], [-1, 0], [0, -1]]def bfs(grid, visited, x, y):que = deque()que.apppend(x, y)visited[x][y] == Truewhile que:curx, cury = que.popleft()for i, j in direction:nextx = curx + inexty = cury + jif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif not visited[nextx][nexty]:que.append([nextx, nexty])visited[nextx][nexty] == 1

岛屿数量用广度搜索重做一遍:


from collections import dequedirection = [[0, 1], [1, 0], [-1, 0], [0, -1]]
def bfs(grid, visited, x, y):queue = deque()queue.append([x, y])visited[x][y] = Truewhile queue:cur_x, cur_y = queue.popleft()  #取出队首元素for i, j in direction:nextx = cur_x + inexty = cur_y + jif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif not visited[nextx][nexty] and grid[nextx][nexty] == 1:visited[nextx][nexty] = Truequeue.append([nextx, nexty])def main():n, m = map(int, input().split())grid = []for i in range(n):grid.append(list(map(int, input().split())))visited = [[False] * m for _ in range(n)]result = 0for i in range(n):for j in range(m):if grid[i][j] == 1 and not visited[i][j]:result += 1bfs(grid, visited, i, j)print(result)if __name__ == "__main__":main()

3.岛屿的最大面积

📝 代码功能

  • 这是一个求最大岛屿面积的程序(不是岛屿数量)。

  • 输入一个 n×m 的矩阵 grid1 表示陆地,0 表示水。

  • 使用 DFS(深度优先搜索)遍历每一块岛屿,同时统计它的面积。

  • 最终输出所有岛屿中的最大面积


🔑 核心思路

  1. 方向数组

     

    direction = [[0, 1], [1, 0], [-1, 0], [0, -1]]

    用来表示四个相邻方向:右、下、上、左。

  2. DFS 深度优先搜索

     

    def dfs(grid, visited, x, y): global area for i, j in direction: nextx = x + i nexty = y + j ...

    • 从一个陆地 (x, y) 出发,递归探索它相邻的陆地;

    • 每发现一个新的陆地,就 area += 1

    • 并且标记 visited[nextx][nexty] = True,避免重复访问。

  3. 遍历矩阵

     

    for i in range(n): for j in range(m): if grid[i][j] == 1 and not visited[i][j]: area = 1 visited[i][j] = True dfs(grid, visited, i, j) res = max(res, area)

    • 遍历整个矩阵;

    • 每遇到一个未访问的陆地 (i, j),说明发现一块新岛屿;

    • 从这里开始 DFS,计算该岛屿面积;

    • 更新最大面积 res

direction = [[0, 1], [1, 0], [-1, 0], [0, -1]]
area = 0
def dfs(grid, visited, x, y):global areafor i, j in direction:nextx = x + inexty = y + jif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]):continueif not visited[nextx][nexty] and grid[nextx][nexty] == 1:area += 1visited[nextx][nexty] = Truedfs(grid, visited, nextx, nexty)n, m = map(int, input().split())
grid = []
for i in range(n):grid.append(list(map(int, input().split())))
visited = [[False] * m for _ in range(n)]
res = 0for i in range(n):for j in range(m):if grid[i][j] == 1 and not visited[i][j]:area = 1visited[i][j] = Truedfs(grid, visited, i, j)res = max(res, area)
print(res)

今日结束啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96340.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杰里708n tws api 简介

/** 通过搜索码搜索tws设备*/int tws_api_search_sibling_by_code();/**打开可发现, 可连接&#xff0c;可被手机和tws搜索到*/int tws_api_wait_pair_by_code(u16 code, const char *name, int timeout_ms);int tws_api_wait_pair_by_ble(u16 code, const char *name, int tim…

高调光比 LED 恒流驱动芯片方案详解AP5165B:36V/1A

AP5165B 是深圳市世微半导体有限公司推出的一款高性能、连续电流模式的降压型&#xff08;Buck&#xff09;LED 恒流驱动芯片。该芯片适用于输入电压高于 LED 电压的应用场景&#xff0c;可驱动单颗或多颗串联的 LED&#xff0c;输出电流最高可达 1A&#xff0c;广泛用于非隔离…

【从零构建企业级线程池管理系统:Python并发编程实战指南】

从零构建企业级线程池管理系统&#xff1a;Python并发编程实战指南 技术博客 | 深入探索Python并发编程、Web开发与现代软件架构设计的完整实践 &#x1f680; 项目背景 在当今高并发的互联网时代&#xff0c;线程池作为并发编程的核心组件&#xff0c;其管理和监控能力直接影…

飞牛系统总是死机,安装个工具查看一下日志

崩溃转储 (kernel crash dump)如果你怀疑是内核 panic&#xff0c;可以开启 kdump 或 kernel crash dump。 安装&#xff1a;sudo apt install kdump-tools # Debian/Ubuntu sudo systemctl enable kdump 下次死机时&#xff0c;系统会把内存 dump 到 /var/crash 里。sudo syst…

2025年AI Agent技术深度解析:原理、应用与未来趋势

一、引言随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;作为人工智能领域的重要分支&#xff0c;正逐渐成为推动各行业智能化转型的关键力量。AI Agent具备自主感知、决策和执行能力&#xff0c;能够在复杂环境中完成特定任务&#xff0c;为人…

linux内核 - 内存分配机制介绍

在linux内核中&#xff0c;下面这张图说明了系统中存在一个可以满足各种内存请求的分配机制。根据你需要内存的用途&#xff0c;你可以选择最接近你目标的分配方式。最底层、最基础的分配器是 页分配器&#xff08;page allocator&#xff09;&#xff0c;它以页为单位分配内存…

PyTorch生成式人工智能——ACGAN详解与实现

PyTorch生成式人工智能——ACGAN详解与实现0. 前言1. ACGAN 简介1.1 ACGAN 技术原理1.2 ACGAN 核心思想1.3 损失函数2. 模型训练流程3. 使用 PyTorch 构建 ACGAN3.1 数据处理3.2 模型构建3.3 模型训练3.4 模型测试相关链接0. 前言 在生成对抗网络 (Generative Adversarial Net…

Python + 淘宝 API 开发:自动化采集商品数据的完整流程​

在电商数据分析、竞品监控和市场调研等场景中&#xff0c;高效采集淘宝商品数据是关键环节。本文将详细介绍如何利用 Python 结合 API&#xff0c;构建一套自动化的商品数据采集系统&#xff0c;涵盖从 API 申请到数据存储的完整流程&#xff0c;并提供可直接运行的代码实现。​…

2025.8.21总结

工作一年多了&#xff0c;在这期间&#xff0c;确实也有不少压力&#xff0c;但每当工作有压力的时候&#xff0c;最后面都会解决。好像每次遇到解决不了的事情&#xff0c;都有同事给我兜底。这种压力&#xff0c;确实会加速一个人的成长。这种狼性文化&#xff0c;这种环境&a…

VS2022 - C#程序简单打包操作

文章目录VS2022 - C#程序简单打包操作概述笔记实验过程新建工程让依赖的运行时程序安装包在安装时运行(如果发现运行时不能每次都安装程序&#xff0c;就不要做这步)关于”运行时安装程序无法每次都安装成功“的应对知识点尝试打包旧工程bug修复从需求属性中&#xff0c;可以原…

在JAVA中如何给Main方法传参?

一、在IDEA中进行传参&#xff1a;先创建一个类&#xff1a;MainTestimport java.util.Arrays;public class MainTest {public static void main(String[] args) {System.out.println(args.length);System.out.println(Arrays.toString(args));} }1.IDEA ---> 在运行的按钮上…

ORACLE中如何批量重置序列

背景&#xff1a;数据库所有序列都重置为1了&#xff0c;所以要将所有的序列都更新为对应的表主键&#xff08;这里是id&#xff09;的最大值1。我这里序列的规则是SEQ_表名。BEGINENHANCED_SYNC_SEQUENCES(WJ_CPP); -- 替换为你的模式名 END; / CREATE OR REPLACE PROCEDURE E…

公号文章排版教程:图文双排、添加图片超链接、往期推荐、推文采集(2025-08-21)

文章目录 排版的基本原则 I 图片超链接 方式1: 利用公号原生编辑器 方式2:在CSDN平台使用markdown编辑器, 利用标签实现图片链接。 II 排版小技巧 自定义页面模版教程 使用壹伴进行文章素材的采集 美编助手的往期推荐还不错 利用365编辑器创建图文双排效果 排版的基本原则 亲…

计算两幅图像在特定交点位置的置信度评分。置信度评分反映了该位置特征匹配的可靠性,通常用于图像处理任务(如特征匹配、立体视觉等)

这段代码定义了一个名为compute_confidence的函数&#xff0c;用于计算两幅图像在特定交点位置的置信度评分。置信度评分反映了该位置特征匹配的可靠性&#xff0c;通常用于图像处理任务&#xff08;如特征匹配、立体视觉等&#xff09;。以下是逐部分解析&#xff1a; 3. 结果…

计算机视觉第一课opencv(三)保姆级教学

简介 计算机视觉第一课opencv&#xff08;一&#xff09;保姆级教学 计算机视觉第一课opencv&#xff08;二&#xff09;保姆级教学 今天继续学习opencv。 一、 图像形态学 什么是形态学&#xff1a;图像形态学是一种处理图像形状特征的图像处理技术&#xff0c;主要用于描…

24.早期目标检测

早期目标检测 第一步&#xff0c;计算机图形学做初步大量候选框&#xff0c;把物体圈出来 第二步&#xff0c;依次将所有的候选框图片&#xff0c;输入到分类模型进行判断 选择性搜索 选择搜索算法&#xff08;Selective Search&#xff09;&#xff0c;是一种熟知的计算机图像…

Java基础知识点汇总(三)

一、面向对象的特征有哪些方面 Java中面向对象的特征主要包括以下四个核心方面&#xff1a;封装&#xff08;Encapsulation&#xff09; 封装是指将对象的属性&#xff08;数据&#xff09;和方法&#xff08;操作&#xff09;捆绑在一起&#xff0c;隐藏对象的内部实现细节&am…

GEO优化专家孟庆涛:让AI“聪明”选择,为企业“精准”生长

在生成式AI席卷全球的今天&#xff0c;企业最常遇到的困惑或许是&#xff1a;“为什么我的AI生成内容总像‘模板套娃’&#xff1f;”“用户明明想要A&#xff0c;AI却拼命输出B&#xff1f;”当生成式AI从“能用”迈向“好用”的关键阶段&#xff0c;如何让AI真正理解用户需求…

【交易系统系列04】交易所版《速度与激情》:如何为狂飙的BTC交易引擎上演“空中加油”?

交易所版《速度与激情》&#xff1a;如何为狂飙的BTC交易引擎上演“空中加油”&#xff1f; 想象一下这个场景&#xff1a;你正端着一杯热气腾腾的咖啡&#xff0c;看着窗外我家那只贪睡的橘猫趴在阳光下打着呼噜。突然&#xff0c;手机上的警报开始尖叫&#xff0c;交易系统监…

windows下jdk环境切换为jdk17后,临时需要jdk1.8的处理

近段时间&#xff0c;终于决定把开发环境全面转向jdk17&#xff0c;这不就遇到了问题。 windows主环境已经设置为jdk17了。 修改的JAVA_HOME D:\java\jdk-17CLASSPATH设置 .;D:\java\jdk-17\lib\dt.jar;D:\java\jdk-17\lib\tools.jar;PATH中增加 D:\java\jdk-17\bin但是有些程序…