DFS之被圍繞的區域

2021-10-23 19:07:19 字數 2038 閱讀 8919

給定乙個二維的矩陣,包含 『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』。如果兩個元素在水平或垂直方向相鄰,則稱它們是「相連」的。

思路深度優先搜尋

由於邊界上的』0』以及與邊界上的』0』相連的』0』都不會被填充,內部包圍的』0』肯定不與邊界相連,所以,我們可以從邊界進行深度優先搜尋,對所有的』0』做標記,那麼其餘沒有被標記的點就全部應該變為』x』.

看**

class

solution

:def

solve

(self, board: list[list[

str]])

->

none

:"""

do not return anything, modify board in-place instead.

"""defdfs

(board, r, c):if

0<= r < rows and

0<= c < cols:

if outside[r]

[c]:

return

if board[r]

[c]==

'o':

# 如果當前元素為'o',將其標記,並對其上下左右做下一步的dfs處理

outside[r]

[c]=

true

dfs(board, r-

1, c)

dfs(board, r+

1, c)

dfs(board, r, c-1)

dfs(board, r, c+1)

ifnot board:

return

rows =

len(board)

cols =

len(board[0]

) outside =[[

false

]* cols for _ in

range

(rows)

]# 用來標記邊界上及和邊界相連的'o'

for i in

range

(rows)

:# 對第一列和最後一列進行遍歷處理,如果元素為'o',進行dfs遍歷處理

if board[i][0

]=='o':

dfs(board, i,0)

if board[i]

[cols-1]

=='o'

: dfs(board, i, cols-1)

for i in

range

(cols)

:# 對第一行和最後一行進行遍歷處理,如果元素為'o',進行dfs遍歷處理

if board[0]

[i]==

'o':

dfs(board,

0, i)

if board[rows-1]

[i]==

'o':

dfs(board, rows-

1, i)

# 標記完成之後,對所有未標記的元素置為'x',包括內部包圍的'o'

for r in

range

(rows)

:for c in

range

(cols):if

not outside[r]

[c]:

board[r]

[c]=

'x'

被圍繞的區域 Dfs

給定乙個二維的矩陣,包含?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 解釋 被圍繞的區間不會存...

130 被圍繞的區域 DFS

難度 中等 題目描述 解題思路 這道題的思路有點巧妙 y 因為邊界上的o和它相鄰的o一定不會被標記,所以可以用逆向思維,先把所有邊界上的o和和它相鄰的o都標記出來,最後把標記還原,沒標記過的變成x 130.被圍繞的區域 2020 7 18 public void solve char board i...

130 被圍繞的區域 (dfs

被圍繞的區域 給定乙個二維的矩陣,包含 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 解釋 被圍...