切換
舊版
前往
大廳
主題

ZeroJudge - b683: 3. 環形偵測 解題心得

Not In My Back Yard | 2020-08-31 00:00:02 | 巴幣 0 | 人氣 237

題目連結:


題目大意:
第一列給定兩正整數 H 、 W (1 ≦ H 、 W ≦ 30),代表接下來有 H 列的輸入,每列給定 W 個字元。每個字元只會是「.」或是「#」,前者代表有 DNA 、後者則無。

一個「環形」的 DNA 片段是,從中挑選任一個有 DNA 的格子,隨便選其中一邊走(只能走在有 DNA 的格子上,且每次只能往上、下、左或是右走一格)會繞回到原本的地方且最後一個格子與一開始的格子相鄰。同時在走該條路的過程上不會有其他岔路。

而一個「線形」類似於環形,只差在最後一個格子並不會與一開始的格子相鄰。

試問整個 DNA 網格中有少個環形片段?長度總和為多少?長度的總乘積是多少?



範例輸入:
範例輸入一:
3 3
...
.#.
...

範例輸入二:
5 6
######
...#..
.#.###
...#.#
####.#

範例輸入三:
11 7
.......
.#####.
.#...#.
.#.#.#.
.#...#.
.#####.
.......
#######
#....#.
..##.#.
.###...


範例輸出:
範例輸出一:
1 8 8

範例輸出二:
1 8 8

範例輸出三:
2 32 192


解題思維:
掃過一次網格(怎麼掃都可以),每遇到一個「.」且沒有被探訪過的話,就利用深度優先搜尋(Depth First Search,DFS)將所有與其直接相鄰或間接相鄰的格子都跑過一次。

在搜尋的過程要記錄有多少個格子(當然,一樣只能走「.」)在過程中被探訪到,代表「長度」,而且當有格子探訪到其後就應當不能被再次探訪(可以用布林陣列表示,或是直接更改地圖的字元)。且因為目標是環形,對於第一個格子會有 2 個格子的選擇、中間的都只有 1 個格子的路可選、而最後一個格子會沒有任何路可走(因為本來能走的都被走過了)。

而且可以記錄一下最後一個格子的位置,跟第一格做比較。如果有相鄰且符合以上環形的特性才是真的環形。此時才可以將環形的數量 + 1 、 環形總長加上這個環形的長,以及將環形長總乘積乘上這個長度。




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

創作回應

更多創作