1. 程式人生 > >noip2000 單詞接龍

noip2000 單詞接龍

ios event oid gif 不能 單個 close name bsp

  

題目描述

單詞接龍是一個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),
在兩個單詞相連時,其重合部分合為一部分,例如 beastbeast 和 astonishastonish ,如果接成一條龍則變為 beastonishbeastonish ,另外相鄰的兩部分不能存在包含關系,
例如 atat 和 atideatide 間不能相連。 輸入輸出格式 輸入格式: 輸入的第一行為一個單獨的整數 nn ( n \le 20n≤
20 )表示單詞數,以下 nn 行每行有一個單詞,輸入的最後一行為一個單個字符,表示“龍”開頭的字母。
你可以假定以此字母開頭的“龍”一定存在. 輸出格式: 只需輸出以此字母開頭的最長的“龍”的長度

  從開始學搜索開始接一直覺得這題很難qwq,所以一直沒有寫過,剛才去看了下大佬的題解,感覺也沒有那麽難啊,23333333,其實是大佬的題解寫的好,就是普通的搜索,枚舉拼接哪一個單詞,枚舉拼接長度,檢查,更新就行了。大佬的題解寫的比較詳細:http://www.cnblogs.com/OIerShawnZhou/

代碼:

技術分享圖片
 1 #include<iostream>
 2 #include<cstring> 
 3 #include<cstdio>
 4 #include<string>
 5 using namespace std;
 6 int n;
 7 string s1[25];
 8 int vis[25]; 
 9 int ans;
10 string s2;
11 bool check(string ss1,string ss2,int k)
12 {
13     int l=ss1.length();
14     for
(int i=0;i<k;++i) 15 if(ss1[l-k+i]!=ss2[i])return 0; 16 return 1; 17 } 18 string add(string tmp,string s,int k) 19 { 20 int l=s.length(); 21 for(int i=k;i<l;++i) 22 tmp+=s[i]; 23 return tmp; 24 } 25 void dfs(string now) 26 { 27 int len=now.length(); 28 ans=max(ans,len); 29 for(int i=1;i<=n;++i) 30 { 31 if(vis[i]>=2)continue; 32 int len2=s1[i].length(); 33 for(int j=1;j<len2;++j) 34 { 35 if(check(now,s1[i],j)) 36 { 37 string tmp=now; 38 tmp=add(tmp,s1[i],j); 39 vis[i]++; 40 dfs(tmp); 41 vis[i]--; 42 } 43 } 44 } 45 } 46 int main() 47 { 48 scanf("%d",&n); 49 for(int i=1;i<=n;++i)cin>>s1[i]; 50 cin>>s2; 51 dfs(s2); 52 printf("%d",ans); 53 return 0; 54 }
View Code

noip2000 單詞接龍