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"

 

posted @ 2018-09-16 10:46  卉卉卉大爷  阅读(476)  评论(0编辑  收藏  举报