当前位置: 首页 > news >正文

DFS岛屿问题:核心思想与实战模板

一、DFS 岛屿问题核心思想

岛屿问题本质是二维网格 DFS + 洪水填充

  1. 遍历网格每一个位置
  2. 遇到陆地 (1),以当前点为起点向上下左右四个方向递归遍历
  3. 遍历过的陆地原地标记为海洋 (0),避免重复访问
  4. 完整走完一片连通陆地,即为一个岛屿

二、通用前置模板(方向数组)

四个移动方向:上、下、左、右,刷题标准写法

// 方向数组:行偏移、列偏移 int dir[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}};

三、基础 DFS 递归函数模板

// grid:二维网格,x,y:当前坐标,m/n:行列总数 void dfs(vector<vector<char>>& grid, int x, int y, int m, int n) { // 越界判定:坐标不在网格内,直接返回 if(x < 0 || x >= m || y < 0 || y >= n) return; // 当前不是陆地,返回 if(grid[x][y] != '1') return; // 标记已访问:陆地改为海洋 grid[x][y] = '0'; // 遍历四个方向递归搜索 for(int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; dfs(grid, nx, ny, m, n); } }

四、经典例题 1:岛屿数量(LeetCode 200)

题目描述

给定由'1'(陆地)和'0'(海洋)组成的二维网格,计算岛屿总数。陆地相邻为上下左右,斜向不算。

完整可运行代码

#include <iostream> #include <vector> using namespace std; int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; void dfs(vector<vector<char>>& grid, int x, int y, int m, int n) { if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != '1') return; grid[x][y] = '0'; for(int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; dfs(grid, nx, ny, m, n); } } int numIslands(vector<vector<char>>& grid) { if(grid.empty()) return 0; int m = grid.size(); int n = grid[0].size(); int count = 0; // 遍历整个网格 for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(grid[i][j] == '1') { count++; dfs(grid, i, j, m, n); } } } return count; } int main() { vector<vector<char>> grid = { {'1','1','0','0','0'}, {'1','1','0','0','0'}, {'0','0','1','0','0'}, {'0','0','0','1','1'} }; cout << "岛屿数量:" << numIslands(grid) << endl; return 0; }

五、经典例题 2:最大岛屿面积

题目描述

求网格中面积最大的岛屿,面积为陆地单元格数量。

int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; int dfsArea(vector<vector<int>>& grid, int x, int y, int m, int n) { if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == 0) return 0; grid[x][y] = 0; int area = 1; // 当前单元格面积 for(int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; area += dfsArea(grid, nx, ny, m, n); } return area; } int maxAreaOfIsland(vector<vector<int>>& grid) { if(grid.empty()) return 0; int m = grid.size(); int n = grid[0].size(); int maxArea = 0; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(grid[i][j] == 1) { int cur = dfsArea(grid, i, j, m, n); maxArea = max(maxArea, cur); } } } return maxArea; }

六、岛屿类题目通用解题步骤

  1. 定义四方向数组,控制遍历方向
  2. 编写 DFS 函数:先判越界 + 判非陆地,再标记访问
  3. 四个方向递归扩散
  4. 双层循环遍历整张网格,遇到陆地就启动 DFS
  5. 根据题目要求:计数 / 求面积 / 求周长等

七、DFS 岛屿题拓展题型

  1. 岛屿周长
  2. 封闭岛屿
  3. 被围绕的区域
  4. 图像渲染(颜色填充)
  5. 网格中的路径搜索

八、新手易错点

  1. 忘记边界越界判断,数组下标越界崩溃
  2. 遍历后不修改原网格,造成重复遍历、死递归
  3. 方向数组写错,漏方向 / 多方向
  4. 行列 m、n 混淆,判断条件颠倒

九、DFS 优缺点回顾

  • 优点:代码简短、逻辑直观,洪水填充首选
  • 缺点:网格极大时,递归深度过深栈溢出,此时改用 BFS

十、今日总结

  1. 岛屿问题 = 二维网格 DFS + 洪水填充
  2. 四方向数组是标准配置,务必熟记
  3. 原地修改网格标记访问,无需额外 visited 数组
  4. 岛屿数量、最大面积是两大入门必背模板
http://www.rkmt.cn/news/1395383.html

相关文章:

  • 按字计费还是按秒计费?AI语音合成价格模型全拆解,90%用户都算错了ROI
  • GPU并行加速MMC-EES电磁暂态仿真:原理、实现与20倍性能提升
  • 基于交叉注意力多信息融合Transformer的高光谱图像分类实战解析
  • ARM架构SError异常机制与RAS特性解析
  • BotW-Save-Manager深度解析:跨平台存档转换技术实现
  • Maven install Java.lang.StackOverflowError
  • 实体企业跨境业务落地阶段 海外云账号代开的实践图景梳理
  • 绝缘绕组线击穿电压试验装置:检测漆包、膜包圆线和各种规格扁线耐击穿电压性能
  • 【2026】Clip Studio Paint中文版下载安装超详细教程(附安装包)
  • ORACLE数据库查询用户表空间使用率
  • 学术写作生死线:ChatGPT引用格式错误率高达68.3%(基于2024年SCI论文抽检数据)
  • 为开源项目配置统一的 Taotoken 模型调用环境
  • 【卫星】基于matlab卫星星座的红外跟踪可配置弹道导弹轨迹,从地球上任何起点和目的地【含Matlab源码 15670期】
  • 半监督学习与相关性感知增强:应对硬件木马检测的数据稀缺挑战
  • 智慧排水管网综合监测解决方案
  • ChatGPT语音交互上线即爆火:实测iOS/Android/Web三端延迟、断连、唤醒失败的7种应急修复法
  • 四大高端胶原饮遭遇性能瓶颈?寻找同类高阶替代方案的底层逻辑
  • 基于机器学习的学生早期成绩预测:从数据挖掘到教育干预实践
  • 嵌入式GPU加速非相干数字全息成像:实现实时高质量三维重建
  • 3大核心优势+全流程服务:广东智惠渔业PB循环水养殖系统选购指南 - 寻茫精选
  • 2026年4月目前有名的制粒机实力厂家推荐,鸡饲料搅拌机/燃料制粒机/双轴连续搅拌机/成品颗粒冷却机,制粒机供应商推荐 - 品牌推荐师
  • 什么是人工智能
  • 大模型面试必看!Agent服务高可用架构深度解析(附实战案例)
  • 如何将OpenClaw等Agent工具无缝对接至Taotoken平台
  • Dask实战指南:并行计算与惰性求值如何解决大数据内存瓶颈
  • 智能音箱手势控制方案:TOF 传感器让音乐听你的手势
  • 使用Taotoken后API调用延迟与稳定性在实际项目中的观察体验
  • Python 魔法方法详解 + 全套可运行代码示例
  • 安达发|橡胶行业自动排产软件:“人脑排产“到“AI智控“的破局之路
  • 内容创作平台集成多模型以提升AI写作多样性与质量