题目取自LeetCode:
本题目为DFS深度搜索的变种题,可以采用DFS的思想进行遍历,但是要注意本题中只需要对边界进行染色,而DFS遍历的时候是将全部都进行染色,因此需要建立备份矩阵进行染色记录。
完整代码如下:
vector<vector<int>>grid_new;
bool isok(vector<vector<int>>& grid,int row,int col,int color_1){//判断是否是连通分量边界进行染色
if(row-1<0||row+1>grid.size()-1||grid[row-1][col]!=color_1||grid[row+1][col]!=color_1)return true;
if(col-1<0||col+1>grid[0].size()-1||grid[row][col-1]!=color_1||grid[row][col+1]!=color_1)return true;
return false;
}
void dfs(vector<vector<int>>& grid,vector<vector<int>>& grid1,int row, int col,int color_1,int color){
if(row<0||row>grid.size()-1||col<0||col>grid[0].size()-1||grid1[row][col]!=color_1)return;//合法性判断
if(isok(grid,row,col,color_1))grid_new[row][col]=color;
grid1[row][col]=color;//对备份矩阵染色
dfs(grid,grid1,row-1,col,color_1,color);
dfs(grid,grid1,row+1,col,color_1,color);
dfs(grid,grid1,row,col-1,color_1,color);
dfs(grid,grid1,row,col+1,color_1,color);
}
vector<vector<int>> colorBorder(vector<vector<int>>& grid, int row, int col, int color) {
grid_new.clear();
grid_new=grid;
vector<vector<int>> grid1=grid;
if(color==grid[row][col])return grid_new;
dfs(grid,grid1,row,col,grid[row][col],color);
return grid_new;
}