題目連結:
題目大意:
第一列給定兩正整數(shù) H 、 W (1 ≦ H 、 W ≦ 30),代表接下來有 H 列的輸入,每列給定 W 個字元。每個字元只會是「.」或是「#」,前者代表有 DNA 、後者則無。
一個「環(huán)形」的 DNA 片段是,從中挑選任一個有 DNA 的格子,隨便選其中一邊走(只能走在有 DNA 的格子上,且每次只能往上、下、左或是右走一格)會繞回到原本的地方且最後一個格子與一開始的格子相鄰。同時在走該條路的過程上不會有其他岔路。
而一個「線形」類似於環(huán)形,只差在最後一個格子並不會與一開始的格子相鄰。
試問整個 DNA 網(wǎng)格中有少個環(huán)形片段?長度總和為多少?長度的總乘積是多少?
範例輸入:
範例輸入一:
3 3
...
.#.
...
範例輸入二:
5 6
######
...#..
.#.###
...#.#
####.#
範例輸入三:
11 7
.......
.#####.
.#...#.
.#.#.#.
.#...#.
.#####.
.......
#######
#....#.
..##.#.
.###...
範例輸出:
範例輸出一:
1 8 8
範例輸出二:
1 8 8
範例輸出三:
2 32 192
解題思維:
掃過一次網(wǎng)格(怎麼掃都可以),每遇到一個「.」且沒有被探訪過的話,就利用深度優(yōu)先搜尋(Depth First Search,DFS)將所有與其直接相鄰或間接相鄰的格子都跑過一次。
在搜尋的過程要記錄有多少個格子(當然,一樣只能走「.」)在過程中被探訪到,代表「長度」,而且當有格子探訪到其後就應當不能被再次探訪(可以用布林陣列表示,或是直接更改地圖的字元)。且因為目標是環(huán)形,對於第一個格子會有 2 個格子的選擇、中間的都只有 1 個格子的路可選、而最後一個格子會沒有任何路可走(因為本來能走的都被走過了)。
而且可以記錄一下最後一個格子的位置,跟第一格做比較。如果有相鄰且符合以上環(huán)形的特性才是真的環(huán)形。此時才可以將環(huán)形的數(shù)量 + 1 、 環(huán)形總長加上這個環(huán)形的長,以及將環(huán)形長總乘積乘上這個長度。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。