题目描述 [ 边框着色]
给出一个二维整数网格 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<vector<int>>& 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<vector<int>> colorBorder(vector<vector<int>>& 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;
}
};