题目描述:
题解:回溯
思路:先将[row,col]的所有连通位置都染色为color,然后再将其中不为边界的部分,重新赋值为原来grid[row][col]的值。
1.oricolor记录原始[row,col]位置的颜色,directions记录上下左右的移动方式,visited记录哪些位置被染色。
2.dfs函数输入为posx,posy,visited,oricolor,如果[posx,posy]位置合法并且grid[posx][posy]=oricolor,则将grid[posx][posy]染色为color,并将visited中[posx,posy]对应位置设为1,然后对[posx,posy]上下左右四个位置调用dfs函数。
3.对visited为1的[i,j]位置,如果其上下左右四个坐标的visited也为1,则其不是边界位置,将grid[i][j]重新赋值为oricolor,注意遍历visited时,坐标位置从1-length-2,避免越界。
class Solution: def colorBorder(self, grid: List[List[int]], row: int, col: int, color: int) -> List[List[int]]: oricolor = grid[row][col] rows = len(grid) cols = len(grid[0]) direction = ([-1,0],[1,0],[0,-1],[0,1]) def dfs(posx,posy,visited,oricolor): if 0<=posx<rows and 0<=posy<cols: if visited[posx][posy]==0 and grid[posx][posy]==oricolor: grid[posx][posy]=color visited[posx][posy]=1 for dx,dy in direction: newx = posx+dx newy = posy+dy dfs(newx,newy,visited,oricolor) else: return visited = [[0 for i in range(cols)]for j in range(rows)] dfs(row,col,visited,grid[row][col]) for i in range(1,len(visited)-1): for j in range(1,len(visited[0])-1): if visited[i][j]==0 and visited[i-1][j]==0 and visited[i+1][j]==0 and visited[i][j-1]==1 and visited[i][j+1]==1: grid[i][j]=oricolor return grid