# 1034. Coloring A Border
###### tags: `Leetcode` `FaceBook` `Medium` `DFS`
Link: https://leetcode.com/problems/coloring-a-border/
## 思路
DFS
一开始的想法是正常做dfs,记录所有visited的点,并用set/list记录所有border
大神解法就是类似backtracking(其实DFS就是backtracking),先把visited的点标成原来的值的相反数,然后做完dfs之后,检查它是不是border,如果不是的话,改成原来的颜色值
backtracking(recursive dfs)和用stack做dfs的区别就在于backtracking访问完这个点之后,还可以继续对这个点做一些修改,但是用stack做,做完就做完了,所以有时可能会需要一些额外空间,但如果只是需要记visited的话,两种方法的空间占用没太大差别,所以无所谓
## Code
```java=
class Solution {
int[][] directions = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
public int[][] colorBorder(int[][] grid, int row, int col, int color) {
dfs(grid, row, col, grid[row][col]);
for(int i = 0;i < grid.length;i++){
for(int j = 0;j < grid[0].length;j++){
if(grid[i][j]<0) grid[i][j] = color;
}
}
return grid;
}
public void dfs(int[][] grid, int r, int c, int originColor){
if(r<0 || r>= grid.length || c<0 || c>= grid[0].length || grid[r][c]!=originColor) return;
grid[r][c] = -originColor;
for(int i = 0; i < directions.length;i++){
int newr = r+directions[i][0];
int newc = c+directions[i][1];
dfs(grid, newr, newc, originColor);
}
if(r>0 && r<grid.length-1 && c>0 && c<grid[0].length-1 && Math.abs(grid[r-1][c])==originColor && Math.abs(grid[r+1][c])==originColor && Math.abs(grid[r][c+1])==originColor && Math.abs(grid[r][c-1])==originColor){
grid[r][c] = originColor;
}
}
}
```