遍历与连通性 · HTML
数学 / 逻辑形态
节点为坐标 (r,c),边由 dirs 生成,predicate 决定可进入性;一次 flood 覆盖与种子相连的全部合法格。
识别信号
- 输入是 grid、image 或 board,移动到相邻格。
- 题意出现岛屿、区域、颜色、洞或边界。
- 格子合法性可由局部值判断。
- 只需每区域访问一次,不需选择最短路线。
容易误判的相似信号
| Signal | Why it is different |
|---|
| 方向受限路径计数 | 只能向右/下且求方案数时更像 grid-dp。 |
| 不同代价的网格路径 | 普通 flood 不保证最优,改用有序前沿。 |
核心不变量
frontier 中每个坐标都已通过边界和谓词检查并被标记;弹出后只需扩展合法邻居。
状态、转移与处理顺序
| Item | Definition |
|---|
| State | 坐标、visited(或原地改值)、方向集合,以及面积/边界标志等区域摘要。 |
| Transition | 生成邻格,依次检查边界、谓词和 visited,再标记并入 frontier。 |
| Frontier / order | 栈或队列均可;顺序不同但最终覆盖区域相同。 |
Python 骨架
from collections import deque
def flood(grid, sr, sc, target, replacement):
if not grid or not grid[0]:
return 0
rows, cols = len(grid), len(grid[0])
if not (0 <= sr < rows and 0 <= sc < cols):
return 0
if target == replacement or grid[sr][sc] != target:
return 0
q = deque([(sr, sc)])
grid[sr][sc] = replacement
area = 0
while q:
r, c = q.popleft()
area += 1
for dr, dc in ((1, 0), (-1, 0), (0, 1), (0, -1)):
nr, nc = r + dr, c + dc
if 0 <= nr < rows and 0 <= nc < cols:
if grid[nr][nc] == target:
grid[nr][nc] = replacement
q.append((nr, nc))
return area
正确性思路
- 加入 frontier 的格子均与已覆盖区域相邻且满足谓词,不会越界。
- 目标区域内任意格都有一条到种子的邻接路径;沿路径归纳必被发现。
- 入队时改色等价于 visited,使每格最多入队一次并保证终止。
复杂度
| Time | Space | Parameters |
|---|
| O(RC) | O(RC) | R、C 为行列数;实际时间可只覆盖区域面积,但最坏为全表。 |
边界条件
- 空矩阵或空行先防护。
- replacement 等于 target 时直接返回。
- 一行/一列仍须正确检查边界。
- 八邻接题目必须补充对角方向。
错误模式
| Pattern | Why it fails / fix |
|---|
| 先索引再判边界 | Python 负下标会静默访问尾部,尤其危险。 |
| 原地标记却同值替换 | 失去 visited 效果并造成重复。 |
| 方向定义不匹配 | 把四邻接误作八邻接会改变连通块。 |
选择与排除规则
- 规则网格先翻译为隐式图。
- 只求区域结果时 DFS/BFS 都可,超深区域偏迭代。
- 可修改输入则原地标记,否则用布尔矩阵。
相关模板
原创微型例子
| 环节 | 内容 |
|---|
| Result | 面积为 5;隔开的 x 不变。 |
| Setup | 一块由五个 x 四向相连的区域,另有一个被 o 隔开的 x。 |
| Trace | 从区域内种子出发,把可达的五个 x 改为 y。 |
Recall prompts
我的补充