leetcode 1034. 边界着色 python

题目描述:

 

 题解:回溯

思路:先将[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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值