P1019 單詞接龍 C DFS 回溯

2021-10-02 07:51:26 字數 1426 閱讀 3874

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」**現兩次),在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關係,例如at 和 atide 間不能相連。

輸入的第一行為乙個單獨的整數n (n≤20)表示單詞數,以下n 行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在.

只需輸出以此字母開頭的最長的「龍」的長度

輸入 #15at

touch

cheat

choose

tact

a輸出 #1

(連成的「龍」為atoucheatactactouchoose)

noip2000提高組第三題

這個題真的反思良多,遞迴一直是我的弱項,而以遞迴為基礎的dfs更是心病,解這道題所遇到的問題或反思且聽我細細道來:

1. 資料結構

別總就想著用那些現成的容器,就拿vector來說,確實很方便可是陣列或字串一樣可以啊,用了vector以後,各個函式的介面處的資料型別轉換會磨完你的信心;

2.函式介面

在寫演算法的時候不要糾結於各個細節函式的實現,如果在寫演算法的時候需要某項功能,請先假設此功能函式已實現, 並想清楚在此演算法中該函式到底需要什麼引數和返回值,函式的介面很重要,先完成演算法,再寫功能函式,先整體後區域性,不然具體功能函式的實現會打斷演算法的思路!

3.深度優先搜尋中的回溯

回溯之後會不會又走進這個分支?這不就是死迴圈了麼?顯然沒有!那麼回溯之後又沒有標記,電腦是怎麼知道該換分支了呢?答案就在dfs函式中的for迴圈上, for迴圈的i值一直在變,這本身就是一種標記了!(剛開始寫回溯演算法的時候沒寫迴圈可真是愁死個人~)

#include

using

namespace std;

class

nodee

//建構函式,順便初始化num

string vel;

int num;

//每個單詞最多使用兩次};

nodee a[21]

;int n, maxx =1;

intfindd

(string a, string b)

//輸出最少重複

if(flag)

return i;

}return0;

}int

dfs(string s,

int len)

//深度優先搜尋

} maxx =

max(maxx, len)

;//更新最大長度

return maxx;

}int

main()

P1019 單詞接龍(DFS 回溯)

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast 和 astonishastonish 如果接成一條龍則變為 beast...

P1019 單詞接龍

洛谷 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部...

P1019 單詞接龍

p1019 單詞接龍 首先需要找到任意兩個單詞的最小重合長度 從前面單詞的尾部比較,依次增加尾部選取長度,直至找到選取尾部和下乙個單詞頭部相同,就找到了最小重合長度。再通過dfs搜尋。includeusing namespace std int n,sum 0 char str 20 50 ch s...