【LeetCode 中等題】60-被圍繞的區域
阿新 • • 發佈:2019-01-11
題目描述:給定一個二維的矩陣,包含 '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'
。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
解法1。DFS的做法,基本思路就是遍歷整個二維陣列,在邊界上的O用DFS不斷把與之相連的O用$標記出來,這一步結束後就可以做復原工作了,剩下仍為O的就是應該被置為X的元素,然後再把$復原成O。
class Solution(object): def solve(self, board): """ :type board: List[List[str]] :rtype: void Do not return anything, modify board in-place instead. """ if not board: return m = len(board)-1 n = len(board[0])-1 # 注意m和n的意義,表示的是下標的上限 for i in range(m+1): for j in range(n+1): if (i == 0 or i == m or j == 0 or j == n) and board[i][j]=='O': self.dfs(i, j, board, m, n) # 一旦發現邊界上有O,就把與之相連的所有O用$圈出來 # 復原,不與邊界O相連的都是被包圍的,都轉為X,而被標為$的復原為O for i in range(m+1): for j in range(n+1): if board[i][j] == 'O': board[i][j] = 'X' if board[i][j] == '$': board[i][j] = 'O' def dfs(self, i, j, board, m, n): if board[i][j] == 'O': board[i][j] = '$' if i > 0 and board[i-1][j] == 'O': self.dfs(i-1, j, board, m, n) if i < m and board[i+1][j] == 'O': self.dfs(i+1, j, board, m, n) if j > 0 and board[i][j-1] == 'O': self.dfs(i, j-1, board, m, n) if j < n and board[i][j+1] == 'O': self.dfs(i, j+1, board, m, n)