LeetCode 被围绕的区域
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
X X X X X O O X X X O X X O X X
运行你的函数后,矩阵变为:
X X X X X X X X X X X X X O X X
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
使用bfs,因为不能对边界上的连通区域填充,所以,需要提前将边界上的连通区域做特殊标记,同样调用bfs将其填充为“M”。最后在改回“O”即可。
最后,对中间的连通区域调用bfs进行填充。
1 class Solution(object): 2 def bfs(self, r, c, square, t): 3 # t == 1边缘填充, t == 0中央填充 4 nearr = [-1,0,1,0] 5 nearc = [0,1,0,-1] 6 if square[r][c] != "O": return 7 if t == 1: 8 square[r][c] = "M" 9 elif t == 0: 10 square[r][c] = "X" 11 for i in range(4): 12 if r+nearr[i] >= 0 and r+nearr[i] < len(square) and c+nearc[i] >= 0 and c+nearc[i]<len(square[0]): 13 self.bfs(r+nearr[i], c+nearc[i], square, t) 14 def solve(self, board): 15 """ 16 :type board: List[List[str]] 17 :rtype: void Do not return anything, modify board in-place instead. 18 """ 19 if board == []: return 20 elif board[0] == []: return 21 22 # 首先,将边缘的O进行标记,标记为M 23 for i in range(len(board[0])): 24 if board[0][i] == "O": 25 self.bfs(0, i, board, 1) 26 for i in range(len(board[0])): 27 if board[len(board)-1][i] == "O": 28 self.bfs(len(board)-1, i, board, 1) 29 for i in range(len(board)): 30 if board[i][0] == "O": 31 self.bfs(i, 0, board, 1) 32 for i in range(len(board)): 33 if board[i][len(board[0])-1] == "O": 34 self.bfs(i, len(board[0])-1, board, 1) 35 36 # 检查中间的连通区域 37 for i in range(0, len(board)): 38 for j in range(0, len(board[0])): 39 if board[i][j] == "O": 40 self.bfs(i, j, board, 0) 41 42 for i in range(len(board)): 43 for j in range(len(board[0])): 44 if board[i][j] == "M": 45 board[i][j] = "O"