洛谷 P1019 單詞接龍 模擬,dfs深搜

2021-09-28 19:34:50 字數 2237 閱讀 1293

分析ac code

題目傳送門

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

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

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

暴力模擬,每次接上乙個單詞

判斷能否接上,把string dict[indexofa]接到string a_上,若成功返回1,失敗返回0

string dict[70+

'a']

;string a_;

/*把`string dict[indexofa]`接到`string a_`上

* 若成功,返回1

* 若失敗,返回0

*/int

attach

(int indexofa)}if

(ok)

minlen =

min(minlen, i);}

//如果可以合併

if(minlen!=

1e5&& minlen<

min(a_.

length()

, b_.

length()

))return status;

}

dfs出現次數兩次以下的單詞,vis記錄出現次數

dfs(k)返回以dict[k]開頭最長的龍

int vis[40]

;int

dfs(

int k)

} vis[k]--;

//復原

a_ = a_copy;

}return maxlen;

}

#include

#include

#include

using

namespace std;

string dict[70+

'a']

;int n;

char start;

string a_;

/*把`string dict[indexofa]`接到`string a_`上

* 若成功,返回1

* 若失敗,返回0

*/int

attach

(int indexofa)}if

(ok)

minlen =

min(minlen, i);}

//如果可以合併

if(minlen!=

1e5&& minlen<

min(a_.

length()

, b_.

length()

))return status;

}int vis[40]

;int

dfs(

int k)

} vis[k]--;

//復原

a_ = a_copy;

}return maxlen;

}int

main()

cin>>start;

int helloworldztr =0;

for(

int i=

0; icout

}

1.判斷單詞最大重複部分

for

(int i=

1; ilength()

&& ilength()

; i++)}

if(ok)

minlen =

min(minlen, i)

;}

a_.

(b_, minlen, b_.

length()

);

3.dfs的正確玩法

洛谷p1019 單詞接龍

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

洛谷p1019單詞接龍

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

洛谷 P1019 單詞接龍

題目描述 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如be ast bea st 和astoni sha st onis h,如果接成一條...