单词接龙(信息学奥赛一本通-T1220)
生活随笔
收集整理的這篇文章主要介紹了
单词接龙(信息学奥赛一本通-T1220)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
單詞接龍是一個與我們經常玩的成語接龍相類似的游戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關系,例如at和atide間不能相連。
【輸入】
輸入的第一行為一個單獨的整數n(n≤20)表示單詞數,以下n行每行有一個單詞(只含有大寫或小寫字母,長度不超過20),輸入的最后一行為一個單個字符,表示“龍”開頭的字母。你可以假定以此字母開頭的“龍”一定存在。
【輸出】
只需輸出以此字母開頭的最長的“龍”的長度。
【輸入樣例】
5
at
touch
cheat
choose
tact
a
【輸出樣例】
23
【源程序】
# include<iostream> # include<cstdio> # include<string> using namespace std; int n; string str[30]; int len_str,sum=0; int times[30]={0};void dfs(int x) { int i,j; int p,q; int num;int work; for(i=1;i<str[x].length();i++) { num=0; for(j=1;j<=n;j++) { if(times[j]<2){ if(str[x][i]==str[j][0]){ p=i,q=0,work=0; while(p<=str[x].length()-1){ if(str[x][p]!=str[j][q]){ num++;work++; break;} p++; q++; } if(!work&&q!=str[j].length()){ len_str+=str[j].length()-q;times[j]++;dfs(j);len_str-=str[j].length()-q;times[j]--;} } else num++;} else num++;} if(num==n&&i==str[x].length()-1){ if(sum<len_str) sum=len_str;return; } } } int main() { int i; cin>>n;for(i=1;i<=n+1;i++) cin>>str[i];for(i=1;i<=n;i++)if(str[i][0]==str[n+1][0]) { times[i]++;len_str=str[i].length();dfs(i);} cout<<sum<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的单词接龙(信息学奥赛一本通-T1220)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Diverse Team(CF-988A
- 下一篇: 动态规划 —— 背包问题 P07 ——