LeetCode 被圍繞的區域
阿新 • • 發佈:2018-09-16
lis self. 連通 spa boa ret pre elf class
給定一個二維的矩陣,包含 ‘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"
LeetCode 被圍繞的區域