原題
給一個二維的矩陣,包含 'X' 和 'O', 找到所有被 'X' 圍繞的區(qū)域,并用 'X' 填充滿。
樣例
給出二維矩陣:
X X X X
X O O X
X X O X
X O X X
把被 'X' 圍繞的區(qū)域填充之后變?yōu)椋?/p>
X X X X
X X X X
X X X X
X O X X
解題思路
- 通過分析可知,就是要將所有以O(shè)組成、但沒有連通到網(wǎng)格邊緣的區(qū)域變?yōu)閄。
- 所以可以沿著四個邊找O,找到每一個O就把相連的都變成Y,因為 他們都是要保留的,最后遍歷二維數(shù)組,遇到O變成X,遇到Y(jié)變回O
- 具體方法可以采用BFS, DFS, Union Find,但是DFS大數(shù)據(jù)會爆棧,DFS最快
完整代碼
import Queue
class Solution(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
def fill(x, y):
if x < 0 or x > height-1 or y < 0 or y > width-1 or board[x][y] != "O":
return
MyQueue.put((x, y))
board[x][y] = "D"
def bfs(x, y):
if board[x][y] == "O":
fill(x, y)
while not MyQueue.empty():
current = MyQueue.get()
i, j = current[0], current[1]
fill(i+1, j)
fill(i-1, j)
fill(i, j+1)
fill(i, j-1)
if len(board) == 0:
return
height, width, MyQueue = len(board), len(board[0]), Queue.Queue()
for i in range(width):
bfs(0, i)
bfs(height - 1, i)
for j in range(1, height - 1):
bfs(j, 0)
bfs(j, width - 1)
for i in range(height):
for j in range(width):
if board[i][j] == "D":
board[i][j] = "O"
elif board[i][j] == "O":
board[i][j] = "X"