class Solution {
List<int[]> border = new ArrayList<int[]>();
public int[][] colorBorder(int[][] grid, int row, int col, int color) {
int value = grid[row][col];
int m = grid.length, n = grid[0].length;
boolean[][] visited = new boolean[m][n];
//深度优先,用递归的方法解题
//设定一个标志位数组,否则会无限递归
visited[row][col] = true;
digui(grid,visited,row,col,value);
for(int i = 0;i < border.size();i++)
{
int[] p = border.get(i);
grid[p[0]][p[1]] = color;
}
return grid;
}
public void digui(int[][] grid, boolean[][] visited,int row, int col, int value)
{
//遇到不是同一颜色的块时,退出递归
if(grid[row][col] != value)
return;
//如果到达边界,则添加到边界数组
if(isBorder(grid,row,col))
{
border.add(new int[]{row,col});
}
//往不同的四个方向去遍历
if(row > 0 && visited[row - 1][col] == false)
{
visited[row - 1][col] = true;
digui(grid,visited,row - 1,col,value);
}
if(col > 0 && visited[row][col - 1] == false)
{
visited[row][col - 1] = true;
digui(grid,visited,row,col - 1,value);
}
if(row < grid.length - 1 && visited[row + 1][col] == false)
{
visited[row + 1][col] = true;
digui(grid,visited,row + 1,col,value);
}
if(col < grid[0].length - 1 && visited[row][col + 1] == false)
{
visited[row][col + 1] = true;
digui(grid,visited,row,col+1,value);
}
}
public boolean isBorder(int[][] grid, int row, int col)
{
if(row == 0 || col == 0 || row == grid.length - 1 || col == grid[0].length - 1)
return true;
else if(grid[row+1][col] == grid[row][col] && grid[row][col+1] == grid[row][col] && grid[row-1][col] == grid[row] [col] && grid[row][col-1] == grid[row][col])
{
return false;
}
else
return true;
}
}
总结:
1 深度优先遍历需要标志位数组
2 比起官方解法代码是真的写的烂