解题思路
令人头皮发麻的翻译,花了一个小时才真正理解题目的本意,首先连通分量大家都理解,那么在从初始点出发的时候,你是不知道你所在的连通分量是什么样的,那么我们就上下左右找,但是找之前要判断一下你所在的点是否在连通分量的边界处,边界条件是:在网格的边界,或者该点的四周存在颜色不同的点。判断完成后,如果是边界就加入到border数组中,不在继续深搜了,不是边界,标记下一个位置已访问,并继续深搜,代码如下:
代码
class Solution {
private:
vector<pair<int, int>> borders;
int direction[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
int c, m, n;
public:
vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
m = grid.size();
n = grid[0].size();
vector<vector<int>> visited(m, vector<int>(n, false));
c = grid[row][col];
dfs(row, col, grid, visited);
for(auto& border : borders) {
grid[border.first][border.second] = color;
}
return grid;
}
void dfs(int x, int y, vector<vector<int>>& grid, vector<vector<int>>& visited) {
bool isborder = false;
for(int i = 0; i < 4; i ++) {
int nx = x + direction[i][0];
int ny = y + direction[i][1];
// 在连通分量的边界上
if(!(nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] == c)) {
isborder = true;
} else {
if(!visited[nx][ny]) {
visited[nx][ny] = true;
dfs(nx, ny, grid, visited);
}
}
}
if(isborder) {
borders.push_back({x, y});
}
}
};