455,DFS和BFS解被圍繞的區域

2021-10-09 19:41:17 字數 2189 閱讀 8398

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

dfs解決這題說的是如果被x圍繞的區域有o,就用x把這個區域內的o給替換掉。那麼我們怎麼判斷o是被x包圍的呢,直接判斷可能不太好操作,我們可以換種思路。如果矩陣的四周都是x,那麼矩陣中只要有o,肯定是被x包圍的,這個很好理解,就像下面這樣

如果矩陣的四周只要有乙個是o,那麼和這個o挨著(挨著僅指上下左右,斜對角不算)的o都不可能被x包圍,比如下面這樣

所以一種比較簡單的判斷方式就是查詢這個矩陣的四周,檢視有沒有o,如果有o,說明他不能被x給包圍,也就是不能被替換成x,我們先把他變為大寫的a(其他值也可以,只要不是x和o就行),然後再遍歷他的上下左右檢視有沒有o,如果有o,那麼這個o也是不能被替換成x的,也要被標記為a……。

最後矩陣中最多會有3種狀態,一種是x,一種是a,一種是o。

我們隨便舉個找個資料畫個圖看一下

弄懂了上面的過程,**就容易多了

public

void

solve

(char

board)}}

//重新復原

for(

int i =

0; i < board.length; i++)}

return;}

private

void

dfs(

int i,

int j,

char

board)

bfs解決dfs是沿著乙個方向一直走下去,bfs是先遍歷四周的,然後再往外擴散,如下圖所示

原理還是一樣的,從矩陣的四周開始,找到乙個o之後,把它變為a,然後把他的四周在遍歷一遍,如果有o就加入到佇列中,然後繼續遍歷佇列中的元素……

public

void

solve

(char

board)

}//重新復原

for(

int i =

0; i < board.length; i++)}

}int

direction =,,

,};private

void

bfs(

int i,

int j,

char

board)

}}

總結要想找到被x包圍的區域,最簡單的一種方式就是從四周開始找,因為如果四周有o,那麼他們肯定是不能被包圍的,如果還有和這個o挨著的,也是不能被包圍的,否則剩下的如果有o,那麼剩下的這些肯定是能被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 解釋 被圍...