給定乙個二維的矩陣,包含』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』dfs解決這題說的是如果被x圍繞的區域有o,就用x把這個區域內的o給替換掉。那麼我們怎麼判斷o是被x包圍的呢,直接判斷可能不太好操作,我們可以換種思路。如果矩陣的四周都是x,那麼矩陣中只要有o,肯定是被x包圍的,這個很好理解,就像下面這樣最終都會被填充為 『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 解釋 被圍...