DFS洪水填充题型(Python)

洪水填充(Flood Fill)是一种基于深度优先搜索(DFS)或广度优先搜索(BFS)的算法,用于标记或遍历与起始点相连的特定区域。常见应用包括图像处理中的颜色填充、矩阵中的连通区域标记等。

算法核心思想

  1. 递归实现DFS
    从起始点出发,递归访问其相邻的未访问节点,直到所有连通区域被标记。
    示例代码(矩阵中的四连通填充):

    def flood_fill(matrix, x, y, target_color, new_color):
        if x < 0 or x >= len(matrix) or y < 0 or y >= len(matrix[0]):
            return
        if matrix[x][y] != target_color:
            return
        matrix[x][y] = new_color
        flood_fill(matrix, x+1, y, target_color, new_color)  # 下
        flood_fill(matrix, x-1, y, target_color, new_color)  # 上
        flood_fill(matrix, x, y+1, target_color, new_color)  # 右
        flood_fill(matrix, x, y-1, target_color, new_color)  # 左
    

  2. 栈实现非递归DFS
    递归可能引发栈溢出,可用显式栈替代:

    def flood_fill_stack(matrix, x, y, target_color, new_color):
        stack = [(x, y)]
        while stack:
            x, y = stack.pop()
            if matrix[x][y] != target_color:
                continue
            matrix[x][y] = new_color
            for dx, dy in [(1,0), (-1,0), (0,1), (0,-1)]:
                nx, ny = x + dx, y + dy
                if 0 <= nx < len(matrix) and 0 <= ny < len(matrix[0]):
                    stack.append((nx, ny))
    

边界条件与优化

  1. 终止条件
    需检查坐标是否越界、当前颜色是否为目标颜色。若填充颜色与目标颜色相同,需提前终止以避免无限循环。

  2. 性能优化

    • 访问标记:对已访问的点进行标记,避免重复处理(如使用辅助矩阵或修改原矩阵)。
    • 方向扩展:四连通(上下左右)或八连通(包含对角线)根据需求调整方向数组。

典型例题

问题:LeetCode 733. 图像渲染
给定一个二维矩阵表示图像,从起始像素(sr, sc)开始,将所有与起始点颜色相同的连通区域填充为新颜色。

解法

def floodFill(image, sr, sc, newColor):
    target = image[sr][sc]
    if target == newColor:
        return image
    stack = [(sr, sc)]
    while stack:
        r, c = stack.pop()
        if image[r][c] == target:
            image[r][c] = newColor
            for dr, dc in [(1,0), (-1,0), (0,1), (0,-1)]:
                nr, nc = r + dr, c + dc
                if 0 <= nr < len(image) and 0 <= nc < len(image[0]):
                    stack.append((nr, nc))
    return image

复杂度分析

  • 时间复杂度:O(M×N),M和N为矩阵的行列数,每个节点最多访问一次。
  • 空间复杂度:O(M×N),递归栈或显式栈的最坏情况空间占用。
### 地图类DFS深度优先搜索算法实现洪水填充 在地图类问题中,深度优先搜索(DFS)是一种常用的遍历或搜索图形结构的方法。通过DFS可以有效地解决诸如连通区域标记、路径寻找等问题。对于洪水填充应用而言,DFS能够帮助识别并修改特定区域内相连的相同属性单元。 #### 使用DFS进行洪水填充的具体过程如下: 当遇到一个符合条件的位置时启动DFS流程,并将该位置的状态更改为已处理状态以防止重复计算;接着递归地向四周相邻节点扩展直到无法继续为止。在此过程中会记录所有被访问过的坐标以便后续操作如颜色替换等[^1]。 ```python def dfs(x, y, old_color, new_color, image): rows, cols = len(image), len(image[0]) # 边界条件判断以及是否已经改变过颜色 if not (0 <= x < rows and 0 <= y < cols) or image[x][y] != old_color: return # 修改当前坐标的颜色 image[x][y] = new_color # 对四个方向上的邻居执行相同的逻辑 directions = [(0, 1), (1, 0), (-1, 0), (0, -1)] for dx, dy in directions: nx, ny = x + dx, y + dy dfs(nx, ny, old_color, new_color, image) # 初始化图像数据和其他参数... start_x, start_y = ... # 起始点坐标 old_color = ... # 原有颜色值 new_color = ... # 新的颜色值 image = [...] # 输入的地图/图像矩阵 dfs(start_x, start_y, old_color, new_color, image) ``` 此代码片段展示了如何利用Python语言中的递归来模拟DFS行为来完成一次完整的洪水填充任务。需要注意的是,在实际编程实践中可能还需要考虑更多细节,例如输入验证、异常处理等方面的内容[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值