**题号: **130
**题目: **被围绕的区域
**难度: **中等
**内容: **给定一个二维的矩阵,包含 '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'
。如果两个元素在水平或垂直方向相邻,则称它们是"相连"的。
class Solution:
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"
分析:
边上的O是安全的,从边上的O蔓延过去与它相连的O也是安全的
遍历四条边把安全的O标记出来,然后把所有未标记的O改X
总结:还是得多刷题,才能更有感觉!