LeetCode130被圍繞的區域
阿新 • • 發佈:2018-12-19
題目描述
給定一個二維的矩陣,包含 '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'
。如果兩個元素在水平或垂直方向相鄰,則稱它們是“相連”的。
解題思路
第一眼看到這個題目就覺得是對圖的搜尋遍歷,一定是需要使用堆疊或者是佇列的。
然後分析本題,首先所有在邊界上的 O
是不需要被替換的,我們需要找的是非邊界上被包圍的 O
,其實也就是把能通過邊界上的 O
到達的節點找到即可。
這樣稍微轉換一下就想明白了,就是按照邊界上的 O
進行廣度優先搜尋就可以。
第一步:
初始化,使用一個佇列 Q
來儲存邊界上的 O
,並將其標記出來。
第二步:
佇列 Q
取出頭部元素,進行廣度優先搜尋(其實就是上下左右四個方向,判斷相應的元素即可)。將搜到的元素進行標記,並將其加入佇列中。
第三步:
繼續,如果佇列 Q
不為空,繼續取其頭元素,重複執行第二步。
以下是圖示:
程式碼實現
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
if board:
queue = []
for index, i in enumerate(board[0]):
if i == "O":
board[0][index] = "-"
queue.append([0, index])
for index, i in enumerate(board[-1]):
if i == "O":
board[len(board) - 1][index] = "-"
queue.append([len(board) - 1, index])
for i in range(len(board)):
if board[i][0] == "O":
board[i][0] = "-"
queue.append([i, 0])
for i in range(len(board)):
if board[i][-1] == "O":
board[i][len(board[0]) - 1] = "-"
queue.append([i, len(board[0]) - 1])
while queue:
top = queue.pop(0)
x, y = top[0], top[1]
# 上下左右新增
if x - 1 > 0 and board[x - 1][y] == "O":
board[x - 1][y] = "-"
queue.append([x - 1, y])
if x + 1 < len(board) and board[x + 1][y] == "O":
board[x + 1][y] = "-"
queue.append([x + 1, y])
if y - 1 > 0 and board[x][y - 1] == "O":
board[x][y - 1] = "-"
queue.append([x, y - 1])
if y + 1 < len(board[0]) and board[x][y + 1] == "O":
board[x][y + 1] = "-"
queue.append([x, y + 1])
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] == "O":
board[i][j] = "X"
if board[i][j] == "-":
board[i][j] = "O"