一、为什么单独讲网格搜索
Mermaid · 渲染中(下方为源码)
graph LR A[矩阵] --> B[BFS/DFS 框架] B --> C[标记访问] C --> D[统计连通块/周长]
"岛屿问题"是面试中出现频率最高的搜索类题型。它的本质是在二维矩阵上跑 BFS/DFS,所有题目共享同一套框架,只在"搜什么、怎么标记、统计什么"上有差异。
| 题目 | 搜索目标 | 方法 |
|---|---|---|
| LC 200. 岛屿数量 | 连通块个数 | DFS/BFS 沉岛 |
| LC 695. 岛屿的最大面积 | 最大连通块 | DFS 计数 |
| LC 994. 腐烂的橘子 | 多源扩散层数 | 多源 BFS |
| LC 130. 被围绕的区域 | 边界连通块 | 边界 DFS 标记 |
| LC 463. 岛屿的周长 | 连通块边界 | DFS + 边界判定 |
| LC 1254. 封闭岛屿 | 不触边界的连通块 | DFS + 触边标记 |
二、通用框架
2.1 网格 DFS 模板
void dfs(char[][] grid, int i, int j) {
// 越界或不满足条件 → 返回
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length) return;
if (grid[i][j] != '1') return;
grid[i][j] = '0'; // 标记已访问(沉岛)
// 四方向扩展
dfs(grid, i + 1, j);
dfs(grid, i - 1, j);
dfs(grid, i, j + 1);
dfs(grid, i, j - 1);
}