單詞接龍C語言解決

2021-09-19 08:00:20 字數 1982 閱讀 5688

描述

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

輸入

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

輸出

對於每組輸入資料,輸出以此字母開頭的最長的「龍」的長度。

下面的測試樣例最後連成的「龍」為atoucheatactactouchoose。

輸入樣例 15at

touch

cheat

choose

tact

a

輸出樣例 1

23

這道題昨天寫到了凌晨1點,哎,開始考慮要不要幾點之後禁止寫**了,對睡眠傷害太大了,得不償失啊。

注意,要求的是最長的龍的長度,所以重合部分盡量最小

例子:bbaa 和 aacc 這兩個單詞的重合部分應該是a,而不是aa。

下面這句話我一直沒看懂,一開始以為是兩個單詞不能呈現包含關係

但是結合上一點看,aa和aabc這兩個單詞是可以接龍的,重合部分為a。

所以這句話的意思應該是,重合部分不能覆蓋前後某個單詞

相鄰的兩部分不能存在包含關係,例如at和atide間不能相連

乙個單詞可以出現兩次,這就意味著如aba這樣的單詞可以自己接自己,重合部分為a。所以單詞找接龍的時候沒必要避開自己

被上面這三點坑的死去活來。

不過是乙個深度優先搜尋罷了,不斷尋找子串,記錄每個單詞的使用次數,注意狀態的恢復。

關鍵部分是尋找子串,注意上面三個坑點。

一開始還打算把每個單詞能接龍的單詞都找出來,後來看看網上的**,發現沒這個必要。但還是把自己的**擺出來吧。我的**複雜了,關鍵還是看看我的**上面的思想吧。

int len;

#include #include #include int ans;

char* tmp;

struct wordword[22];

int strstr(char* a,char b,int t)

void dfs(struct word* w,int len)

dfs(w->n[i],len);

w->n[i]->accurnum--;

len -= w->childlen[i];

}if(len > ans)ans = len;

}void judge(struct word* a,struct word* b)

}if(flag && j != strlen(a->s))

s = strstr(b->s, (a->s)[0],s-1);

}}int main()

scanf("%c",&l);

scanf("%c",&l);

for(int i = 0;i < n;i++)

}

ans = 0;

for(int i = 0;i < n;i++)

}printf("%d\n",ans);

}

1018 單詞接龍

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

1220 單詞接龍

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

zufeoj 單詞接龍

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