ETH官方钱包

前往
大廳
主題

LeetCode - 0959. Regions Cut By Slashes 解題心得

Not In My Back Yard | 2024-09-05 12:00:14 | 巴幣 0 | 人氣 30

題目連結:


題目意譯:
有一個大小為 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 會不行呢?因為有可能最左下角的點在其他格被標記成「不能經過」,這樣一來左中那一個點就很有可能走不到下中的那一個點。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作