LeetCode-1034. 边框着色

题目描述 [ 边框着色]

给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色。

只有当两个网格块的颜色相同,而且在四个方向中任意一个方向上相邻时,它们属于同一连通分量。

连通分量的边界是指连通分量中的所有与不在分量中的正方形相邻(四个方向上)的所有正方形,或者在网格的边界上(第一行/列或最后一行/列)的所有正方形。

给出位于 (r0, c0) 的网格块和颜色 color,使用指定颜色 color 为所给网格块的连通分量的边界进行着色,并返回最终的网格 grid 。

示例

输入:grid = [[1,1,1],[1,1,1],[1,1,1]], r0 = 1, c0 = 1, color = 2
输出:[[2, 2, 2], [2, 1, 2], [2, 2, 2]]

解题思路

  • 题目意思真难理解,题目意思是把指定位置的连通分量的那一整块边缘染成指定颜色, 只要四个方向有一个方向不是连通分量的颜色(包括边界)就给它染色。
  • DFS递归

代码

class Solution {
public:
    void dfs(vector>& g, int r, int c, int cl) {
        if (r < 0 || c < 0 || r >= g.size() || c >= g[r].size() || g[r][c] != cl) return;
        g[r][c] = -cl;    // 着色
        dfs(g, r - 1, c, cl),
        dfs(g, r + 1, c, cl),
        dfs(g, r, c - 1, cl),
        dfs(g, r, c + 1, cl);
        if (r > 0 && r < g.size() - 1 && c > 0 && c < g[r].size() - 1 && cl == abs(g[r - 1][c]) &&
            cl == abs(g[r + 1][c]) && cl == abs(g[r][c - 1]) && cl == abs(g[r][c + 1]))
            // 将原四周同色的块,颜色还原
            g[r][c] = cl;
    }
    vector> colorBorder(vector>& grid, int r0, int c0, int color) {
        dfs(grid, r0, c0, grid[r0][c0]);
        // 根据dfs标记(负数)过的方块进行着色
        for (auto i = 0; i < grid.size(); ++i)
            for (auto j = 0; j < grid[i].size(); ++j)
                grid[i][j] = grid[i][j] < 0 ? color : grid[i][j];
        return grid;
    }
};

你可能感兴趣的:(LeetCode-1034. 边框着色)