洛谷 P1019 單詞接龍(dfs 字串)題解

2021-09-26 01:12:02 字數 1547 閱讀 9417

題目描述

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

輸入輸出格式

輸入格式:

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:5at

touch

cheat

choose

tact

a輸出樣例#1:

23說明

時空限制:1000ms 125m

(連成的「龍」為atoucheatactactouchoose)

noip2000提高組第三題

思路:

1、一道dfs+字串的題目。

2、先用陣列used[i]把所有單詞初始化為0,表示所有單詞均未使用過。然後從給定的字元頭進行深搜,遍歷每個單詞,先判斷該單詞使用次數是否已滿兩次,再通過自定義check函式判斷該單詞是否符合條件能拼接上,如果可以則呼叫自定義split函式拼接單詞。然後判斷長度改變,是的話可以連線,繼續深搜,否則回溯,具體見**注釋。

**如下:

#include 

#include

#include

#include

using namespace std;

int n;

//單詞數

int ans=0;

//最長的"龍"的長度

int used[25]

;//表示單詞用過的次數

string word[25]

,start;

//表示單詞和開頭的字母

bool check

(string str3,string str4,

int t)

//檢查兩個單詞是否符合拼接條件

return

true

;//如果後面單詞字首與前面單詞字尾相同,返回true

}void

split

(string &str3,string str4,

int t)

//拼接

void

dfs(string str1)

//深搜 }}

}}intmain()

洛谷 P1019 單詞接龍 (DFS)

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

洛谷P1019 單詞接龍(dfs)

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

洛谷P1019單詞接龍 dfs

include include include includeusing namespace std int n int ans 0 string s 22 int u 22 int check string s1,string s2 if p 1 return i return 0 void df...