DFS洪水填充题型(C++)

DFS洪水填充算法详解

洪水填充(Flood Fill)是一种基于深度优先搜索(DFS)或广度优先搜索(BFS)的算法,常用于解决图像处理、连通区域标记等问题。其核心思想是从起始点出发,递归或迭代地遍历所有符合条件的相邻区域。

算法实现步骤

定义方向数组

int dx[] = {-1, 1, 0, 0}; // 上下左右
int dy[] = {0, 0, -1, 1};

DFS递归实现

void dfs(vector<vector<int>>& grid, int x, int y, int oldColor, int newColor) {
    if (x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] != oldColor) {
        return;
    }
    grid[x][y] = newColor;
    for (int i = 0; i < 4; ++i) {
        dfs(grid, x + dx[i], y + dy[i], oldColor, newColor);
    }
}

边界条件处理

确保递归或迭代过程中不越界,通常需要检查坐标是否在矩阵范围内。对于连通性问题,还需判断当前点是否符合填充条件(如颜色、数值等)。

性能优化

栈溢出预防 对于大规模矩阵,递归可能导致栈溢出。可改用BFS或显式栈实现的DFS:

void dfs_stack(vector<vector<int>>& grid, int x, int y, int oldColor, int newColor) {
    stack<pair<int, int>> st;
    st.push({x, y});
    while (!st.empty()) {
        auto [cx, cy] = st.top();
        st.pop();
        if (cx < 0 || cx >= grid.size() || cy < 0 || cy >= grid[0].size() || grid[cx][cy] != oldColor) {
            continue;
        }
        grid[cx][cy] = newColor;
        for (int i = 0; i < 4; ++i) {
            st.push({cx + dx[i], cy + dy[i]});
        }
    }
}

典型例题

岛屿数量问题

int numIslands(vector<vector<char>>& grid) {
    int count = 0;
    for (int i = 0; i < grid.size(); ++i) {
        for (int j = 0; j < grid[0].size(); ++j) {
            if (grid[i][j] == '1') {
                dfs(grid, i, j);
                ++count;
            }
        }
    }
    return count;
}

void dfs(vector<vector<char>>& grid, int x, int y) {
    if (x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] != '1') {
        return;
    }
    grid[x][y] = '0';
    dfs(grid, x + 1, y);
    dfs(grid, x - 1, y);
    dfs(grid, x, y + 1);
    dfs(grid, x, y - 1);
}

注意事项

  • 对于大规模数据,优先使用非递归实现。
  • 若需记录访问状态,可额外使用visited数组避免重复访问。
  • 方向数组可根据问题扩展为8方向(加入对角线)。
### 地图类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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值