首页 > 试题广场 >

被围绕的区域

[编程题]被围绕的区域
  • 热度指数:2246 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 n*m 大小的的矩阵,矩阵中由 ‘X' 和 'O' 构成,找到所有被 'X' 围绕的区域,并将其用 'X' 填充。

例如:
[['X','X','X','X'],
['X','O','O','X'],
['X','O','X','X'],
['X','X','O','X']]
中间的三个 ‘O’ 被 'X'围绕,因此将其填充为 'X' ,但第四行的 'O' 下方没有被 'X' 围绕,因此不改变,结果为
[['X','X','X','X'],
['X','X','X','X'],
['X','X','X','X'],
['X','X','O','X']]

数据范围: ,矩阵中保证只含有 'X' 和 'O'
示例1

输入

[[X,X,X,X],[X,O,O,X],[X,O,X,X],[X,X,O,X]]

输出

[[X,X,X,X],[X,X,X,X],[X,X,X,X],[X,X,O,X]]
示例2

输入

[[O]]

输出

[[O]]

备注:

from operator import le
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param board char字符型二维数组 
# @return char字符型二维数组
#
class Solution:
    def surroundedArea(self , board: List[List[str]]) -> List[List[str]]:
        # write code here
        width = len(board[0])
        height = len(board)

        m = [[0 for i in range(width)] for j in range(height)]

        next_group = 1
        res_gourp = set()

        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] == 'X':
                    continue

                # 已经被标记组别
                if m[i][j] < next_group and m[i][j] != 0:
                    continue
                else:
                    res_gourp.add(next_group)
                    # 开始使用dfs标记组别
                    self.dfs(board, i, j, next_group, m)
                    next_group += 1
        
        # 绕圈一周
        for i in range(width):
            if m[0][i] in res_gourp:
                res_gourp.remove(m[0][i])

        for i in range(height):
            if m[i][0] in res_gourp:
                res_gourp.remove(m[i][0])

        for i in range(width):
            if m[height-1][i] in res_gourp:
                res_gourp.remove(m[height-1][i])

        for i in range(height):
            if m[i][width-1] in res_gourp:
                res_gourp.remove(m[i][width-1])

        for i in range(len(board)):
            for j in range(len(board[0])):
                if m[i][j] in res_gourp:
                    board[i][j] = 'X'

        return board

    def dfs(self, board, x,y, now_group, m):
        if board[x][y] == 'X':
            return
        if m[x][y] == now_group:
            return
        m[x][y] = now_group

        if x > 1:
            self.dfs(board, x-1,y,now_group,m)

        if y > 1:
            self.dfs(board, x,y-1,now_group,m)

        if x < len(m) - 1:
            self.dfs(board, x + 1,y,now_group,m)

        if y < len(m[0]) - 1:
            self.dfs(board, x,y + 1,now_group,m)


编辑于 2024-03-23 00:07:47 回复(0)

问题信息

难度:
1条回答 2405浏览

热门推荐

通过挑战的用户

查看代码