PrepStack · Markdown HTML

网格 Flood Fill

遍历与连通性 · HTML

数学 / 逻辑形态

节点为坐标 (r,c),边由 dirs 生成,predicate 决定可进入性;一次 flood 覆盖与种子相连的全部合法格。

识别信号

容易误判的相似信号

SignalWhy it is different
方向受限路径计数只能向右/下且求方案数时更像 grid-dp。
不同代价的网格路径普通 flood 不保证最优,改用有序前沿。

核心不变量

frontier 中每个坐标都已通过边界和谓词检查并被标记;弹出后只需扩展合法邻居。

状态、转移与处理顺序

ItemDefinition
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

正确性思路

  1. 加入 frontier 的格子均与已覆盖区域相邻且满足谓词,不会越界。
  2. 目标区域内任意格都有一条到种子的邻接路径;沿路径归纳必被发现。
  3. 入队时改色等价于 visited,使每格最多入队一次并保证终止。

复杂度

TimeSpaceParameters
O(RC)O(RC)R、C 为行列数;实际时间可只覆盖区域面积,但最坏为全表。

边界条件

错误模式

PatternWhy it fails / fix
先索引再判边界Python 负下标会静默访问尾部,尤其危险。
原地标记却同值替换失去 visited 效果并造成重复。
方向定义不匹配把四邻接误作八邻接会改变连通块。

选择与排除规则

相关模板

RelationTemplateBoundary
加入有序前沿最小堆边界扩张 / Priority Flood遍历顺序开始影响有效边界。
网格特化DFS 连通块与可达性节点是格子且邻居由方向数组生成。

原创微型例子

环节内容
Result面积为 5;隔开的 x 不变。
Setup一块由五个 x 四向相连的区域,另有一个被 o 隔开的 x。
Trace从区域内种子出发,把可达的五个 x 改为 y。

Recall prompts

我的补充