题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),
在两个单词相连时,其重合部分合为一部分,例如 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 }
知世故而不世故,处江湖而远江湖,才是最成熟的善良