NOIP2000提高組 單詞接龍

2021-08-08 18:14:05 字數 1064 閱讀 9845

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

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

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

touch

cheat

choose

tacta23

輸出樣例說明:連成的「龍」為atoucheatactactouchoose

由於單詞個數不超過20,因此可以通過回溯法嘗試所有情況。

在進行回溯法之前先做預處理,即確定每兩個單詞之間是否能連線,如果能連線,則記錄交叉的長度。該長度也被用於在進行兩個單詞連線時計算總長度。

#include 

#include

#include

#include

#include

#include

#include

using namespace std; #define n 22 string words[n]; int n, relation[n][n], used[n] = , ans[2*n], ans1[2*n], result = 0, de; // 計算兩個單詞之間的交叉情況,x在前,y在後,返回交叉長度 int re(int x, int y) } for(i=1; i<=n; i++) } } int main(){ ios::sync_with_stdio(false); int i, j; cin>>n; for(i=1; i<=n; i++) cin>>words[i]; cin>>words[0]; init(); ans1[0] = 0; dfs(0, 1, 1); cout<

<

NOIP 2000 提高組 複賽 單詞接龍

noip 2000 提高組 複賽 單詞接龍 1.程式編寫過程中,發現接龍處的判斷編寫有誤,馬上著手修改。2.樣例通過,提交40分,錯了測試點1 4.輸入 1envelopee 輸出 154.上述測試點是挺經典的,不容易考慮到。envelope envelope 拼接成envelopenvelope ...

NOIp2000提高組 單詞接龍(dfs)

思路 首先要知道兩個單詞合併時,合併部分取的是最小重疊部分,相鄰的兩部分不能存在包含關係就是說如果存在包含關係,就不能標記為使用過,每個單詞最多出現兩次。搜尋的時候開個vis標記陣列,用來標記每個單詞使用的次數,從開頭字母開始搜尋,兩層for,第一層for搜尋每乙個單詞,第二層for是判斷我們搜尋的...

NOIP 2023年提高組複賽 單詞接龍

說起這道題就心酸,幾個資料特別坑,幾分鐘寫完的程式花了乙個上午除錯bug,吐槽完畢,進入正題 1,需要建立乙個標記陣列vis表示當前單詞被採取的次數 2,for迴圈中找到每乙個符合條件的龍頭,初始化標記陣列後進行深度優先搜尋 3,因為連線起來的單詞要最長,所以對比是選擇從上乙個單詞的末尾與當前單詞的...