代码随想录算法训练营第五十一天|99.岛屿数量 深搜 、99.岛屿数量 广搜、岛屿的最大面积
#99. 岛屿数量
深度优先搜索:
每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
本题思路:用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。

def dfs(grid, visited, x, y):if visited[x][y] or grid[x][y] == 0:return # 终止条件:访问过的节点 或者 遇到海水visited[x][y] = True # 标记访问过directions = [[0, 1], [1, 0], [0, -1], [-1, 0]] # 四个方向(上右下左的顺序)for dx, dy in directions:nextx = x + dxnexty = y + dyif 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]): # 检查是否越界dfs(grid, visited, nextx, nexty)def main():n, m = map(int, input().split())grid = [list(map(int, input().split())) for _ in range(n)]visited = [[False] * m for _ in range(n)]result = 0for i in range(n):for j in range(m):if not visited[i][j] and grid[i][j] == 1:result += 1 # 遇到没访问过的陆地,+1dfs(grid, visited, i, j) # 将与其链接的陆地都标记上 Trueprint(result)if __name__ == "__main__":main()
广度优先搜索:
from collections import dequedef bfs(grid, visited, x, y):# 使用deque实现队列queue = deque([(x, y)])visited[x][y] = True # 加入队列后立即标记为已访问directions = [[0,1],[1,0],[0,-1],[-1,0]]while queue:curx, cury = queue.popleft() # 从队列中取出当前位置for dx, dy in directions: # 遍历四个方向nextx, nexty = curx + dx, cury + dy# 检查新位置是否在网格内if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]):# 如果新位置未被访问且是陆地,则加入队列并标记为已访问if not visited[nextx][nexty] and grid[nextx][nexty] == 1:queue.append((nextx, nexty))visited[nextx][nexty] = Truedef main():n, m = map(int, input().split())# 使用列表推导式初始化网格和访问记录grid = [list(map(int, input().split())) for _ in range(n)]visited = [[False] * m for _ in range(n)]result = 0# 遍历网格,找到未访问的陆地,计算陆地区域数量for i in range(n):for j in range(m):if not visited[i][j] and grid[i][j] == 1:result += 1bfs(grid, visited, i, j)print(result)if __name__ == "__main__":main()
100. 岛屿的最大面积
DFS写法:
dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地
def dfs(grid, visited, x, y):# 定义四个方向directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]if visited[x][y] or grid[x][y] == 0: # 终止条件:访问过的节点 或者 遇到海水returnvisited[x][y] = True # 标记访问过global count # 使用全局变量count,因为需要在dfs调用之间共享状态count += 1for dx, dy in directions:nextx = x + dxnexty = y + dy# 检查新坐标是否越界if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]):dfs(grid, visited, nextx, nexty) # 递归调用dfsdef find_max_island_area(grid):# 获取网格的行数和列数n = len(grid)m = len(grid[0])# 初始化访问记录矩阵visited = [[False] * m for _ in range(n)]# 初始化结果变量result = 0for i in range(n): # 遍历网格for j in range(m):if not visited[i][j] and grid[i][j] == 1: # 如果是未访问的陆地count = 0 # 重置计数器dfs(grid, visited, i, j) # 执行深度优先搜索result = max(result, count) # 更新最大陆地区域大小return result
BFS写法:
from collections import dequeclass Solution:def maxAreaOfIsland(self, grid):# 定义四个方向self.dir = [[0, 1], [1, 0], [0, -1], [-1, 0]]# 初始化结果变量result = 0# 遍历网格,寻找未访问的陆地for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j] == 1:# 使用bfs算法计算陆地区域大小area = self.bfs(grid, i, j)result = max(result, area)return resultdef bfs(self, grid, x, y):# 检查坐标是否越界if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]):return 0# 访问记录集合visited = [[False] * len(grid[0]) for _ in range(len(grid))]# 初始化队列queue = deque([(x, y)])# 初始化陆地区域计数count = 1while queue:# 从队列中取出当前坐标xx, yy = queue.popleft()# 标记当前坐标为已访问visited[xx][yy] = True# 遍历四个方向for dx, dy in self.dir:nextx, nexty = xx + dx, yy + dy# 如果新坐标在网格内且未被访问过且是陆地if 0 <= nextx < len(grid) and 0 <= nexty < len(grid[0]) and not visited[nextx][nexty] and grid[nextx][nexty] == 1:# 将新坐标加入队列queue.append((nextx, nexty))# 标记新坐标为已访问visited[nextx][nexty] = True# 更新陆地区域计数count += 1return count# 示例使用
# 假设有一个网格
grid = [[1, 1, 0, 0, 0],[1, 1, 0, 0, 0],[0, 0, 0, 1, 1],[0, 0, 0, 1, 1]
]
# 创建Solution实例并调用maxAreaOfIsland方法
solution = Solution()
print(solution.maxAreaOfIsland(grid))
相关文章:
代码随想录算法训练营第五十一天|99.岛屿数量 深搜 、99.岛屿数量 广搜、岛屿的最大面积
#99. 岛屿数量 深度优先搜索: 每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 本题思路:用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋…...
【c++刷题笔记-图论】day62:Floyd 算法、A * 算法精讲
Floyd 算法 重点:多源最短路径算法,前的最短路径算法是单源的也就是只有一个起点。递推每个节点之间最短的路径 时间复杂度: O(n^3)空间复杂度:O(n^2) #include <iostream> #include <vector> using namespace std…...
FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真
目录 前言一、ip核是什么?1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核(vivado)四、举例(clocking wizard ip核)4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…...
Java中的分布式日志与追踪
随着微服务架构的流行,分布式系统变得越来越复杂。在分布式系统中,日志和追踪是两个关键的工具,用于监控系统的健康状态、故障排除和性能优化。本文将详细探讨Java中的分布式日志与追踪,介绍相关的技术和工具,并通过代…...
案例精选 | 某省级妇幼保健院自动化安全运营中心建设成功实践
某省级妇幼保健院,是一所集医疗、保健、教学、科研、预防、康复于一体的省级三级甲等妇幼保健机构,专注于为全省妇女儿童提供全方位、高质量的医疗保健服务。医院拥有4个院区,总建筑面积10万平米,开放床位700张,年门诊…...
数字化时代:传统行业的转型之路在何方?
在当前数字化时代的浪潮中,传统行业面临着新挑战与新机遇。为了在激烈的市场竞争中立足并谋求发展,传统行业的运营必须积极拥抱数字化转型。蚓链数字化解决方案帮助你总结如下。 数字化思维:开启转型之门的钥匙 数字化思维是传统行业转型的…...
【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载
演示视频 基于stm32设计的按键PWM控制舵机窗帘&柜子&门禁&家居等控制系统——完整资料下载 摘要 随着智能家居技术的不断发展,舵机在自动化家居设备中的应用变得越来越广泛。本文设计并实现了一种基于STM32单片机的按键PWM控制舵机系统。通过按键可以精…...
【生成式人工智能-八-大型语言模型的能力评估】
语言模型的能力评估 评估难度来自哪里输出没办法确定给出选择题本身就没标准答案 评估方法人力用语言模型来评估语言模型语言模型的偏爱 评估语言模型的数据集评估模型的不同能力阅读长文的能力心智测验道德性测试安全性测试 通常情况下我们想到的语言模型能力评估,…...
Qt ts文件详解
Qt ts文件(Translation Source file:翻译源文件)是Qt框架中用于存储翻译文本和相关上下文信息的一种特定格式文件,它是Qt Linguist(语言家)工具使用的基础。Qt Linguist是Qt开发工具包中的一个应用程序&…...
操作系统 IO 相关知识
操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO:同步阻塞 IONIO:同步非阻塞 IOIO 多路复用信号驱动 IOAIO:异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…...
C++_手写share_ptr
以下是一个简化版的 shared_ptr 的实现: #include <iostream> template <typename T> class SimpleSharedPtr { public:// 构造函数explicit SimpleSharedPtr(T* ptr nullptr) : ptr_(ptr), count_(ptr ? new size_t(1) : nullptr) {}// 拷贝构造函数…...
【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案
一、项目概述 本方案旨在设计一款集成6.86寸高清触摸显示屏的音频效果器,通过HMI(Human-Machine Interface)芯片Model 4驱动,实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制,还内置丰富的预…...
vue设置每次加载页面时展示一个双开门效果
一、首先创建一个双开门的蒙层组件 <!-- DoorOverlay.vue --> <template><div v-if"isVisible" class"door-overlay"><div class"door left-door"></div><div class"door right-door"></div&…...
简单的docker学习 第8章 docker常用服务安装
第8章 常用服务安装 本章主要学习最常用的,也是安装起来稍有些麻烦的 MySQL 与 Redis 两种服务器的Docker 安装。至于其它服务器的 Docker 安装,大家可自行查找资料。只要 MySQL 与 Redis这两类服务器学会了安装,其它服务器的安装基本也不会…...
01、MySQL-DDL(数据定义语言)
目录 1、查询 2、创建 3、修改 4、删除 1、查询 1、查询所有数据库 show databases; 2、查询当前数据库 select database(); 3、查询当前数据库中所有的表(需要先进入这个数据库) use d1; show tables; 4、查询表结构 desc users; 5、查询指定表的建…...
RT-Thread 操作系统 之 线程间同步 IO设备模型
RT-Thread 操作系统 之 线程间同步 IO设备模型 一、线程间同步1.1、信号量1.1.1、信号量结构体1.1.2、信号量的使用和管理1.1.3、信号量同步例程 1.2、互斥量1.2.1、互斥量的使用和管理 1.3、事件集1.3.1、事件集使用和管理方法1.3.2、事件集三个线程同步实例 二、IO设备模型2.…...
力扣leetcode移动0(C++)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...
阿里云部署open-webui实现openai代理服务
一、 环境准备 1. 阿里云服务器,ubuntu22系统 2. 外网服务器,linux系统 3. openai API Key 二、实际操作记录(阿里云服务器端) 1. 根据官方文档安装open-webui服务端: 🚀 Getting Started | Open WebUI 1. 如果服务器配置比较低,…...
你的工作环境,选对劳保鞋了吗?守护安全,从脚下开始!
在众多的工作场所中,我们穿梭于不同的工作环境,从繁忙的工厂车间到复杂的建筑工地,再到需要精细操作的实验室……每一步都承载着对安全的期许和对效率的追求。但你是否意识到,脚下那双不起眼的劳保鞋,其实是守护你安全…...
【Linux】编译器gcc/g++ 、程序翻译过程、动静态库
目录 1.gcc/g Linux编译器1.1. gcc与g的安装1.2. gcc与g用法1.2.1.gcc用法1.2.2. g用法 1.3. 程序翻译的过程1.3.1. 前提知识:1.3.2. 预处理(语言种类不变)条件编译用途: 1.3.3. 编译(生成汇编语言)1.3.4. …...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
若依项目部署--传统架构--未完待续
若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...
【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...
[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...
Linux实现线程同步的方式有哪些?
什么是线程同步? 想象一下超市收银台:如果所有顾客(线程)同时挤向同一个收银台(共享资源),场面会一片混乱。线程同步就是给顾客们发"排队号码牌",确保: 有序访…...
