題目連結:
題目意譯:
有一個大小為 n × n 的網格是由多個大小 1 × 1 的方格組成,其中每一個 1 × 1 方格由一個 '/' 、 '\' 或是一個空白 ' ' 所組成。這些字元會將方格切成若干個連續的區域。
給定網格 grid,其以一個字串陣列表示,回傳其中的區域數。
注意到所有反斜線都是跳脫字元(Escape Character),所以一個 '\' 將會表示成 '\\'。
限制:
n == grid.length == grid[i].length
1 ≦ n ≦ 30
grid[i][j] 只會是 '/' 、 '\' 或是 ' '。
範例測資:
範例 1:
輸入: grid = [" /","/ "]
輸出: 2
範例 2:
輸入: grid = [" /"," "]
輸出: 1
範例 3:
輸入: grid = ["/\\","\\/"]
輸出: 5
解釋: 記得每一個 \ 字元都是跳脫的,因此 "\\/" 代表 \/ 而 "/\\" 代表著 /\。
解題思維:
從下圖可以看到每一格的頂點單獨取出來的話會形成一個有著 2 × 2 個點的格子:
而如果我們改成右邊的 4 × 4 個點的格子,則可以看到此時「左下方」的點是走不到「右上方」的(前提是如果只走上下左右四個方向的話)。
因此我們可以掃過一次 grid 並計算出哪些「點」需要被標記成「不能經過」(即被斜線劃過的那些點)。
然後對剩下的點進行若干次深度優先搜尋(Depth First Search,DFS)或是廣度優先搜尋(Breadth First Search,BFS)便可以知道有多少個區域(如
這題;本題是用前者)。
那為何改成下面那個 3 × 3 會不行呢?因為有可能最左下角的點在其他格被標記成「不能經過」,這樣一來左中那一個點就很有可能走不到下中的那一個點。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。