蓝桥杯 单词接龙

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。

输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

只需输出以此字母开头的最长的“龙”的长度

 

又见证了自己是多菜。也知道是暴搜但是就是感觉自己不会。。。。

 

思路:枚举可以连接的字符串,然后搜就完了,打上标记,然后回溯

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int vis[20],n,maxx;
 5 string s[20];
 6 
 7 void dfs(string str,int len) {
 8     maxx=max(maxx,len);
 9     for(int i=0;i<n;i++) {
10         if(vis[i]<2) {
11             int lenans=str.size(),lentmp=s[i].size();
12             for(int k=lenans-1;k>=0;k--) {
13                 int pos=k;
14                 for(int j=0;j<lentmp&&pos<lenans;j++) {
15                     if(str[pos]==s[i][j]) pos++;
16                     else break;
17                 }
18                 if(pos==lenans) {
19                     vis[i]++;
20                     dfs(s[i],len+lentmp-(lenans-k));
21                     vis[i]--;
22                 }
23             }
24         }
25     }
26 }
27 int main() {
28     while(~scanf("%d",&n)) {
29         maxx=0;
30         for(int i=0;i<n;i++) cin>>s[i];
31         char c;
32         cin>>c;
33         for(int i=0;i<n;i++) {
34             if(s[i][0]==c) {
35                 vis[i]++;
36                 dfs(s[i],s[i].size());
37                 vis[i]--;
38             }
39         }
40         printf("%d\n",maxx);
41     }
42     return 0;
43 }

 

posted @ 2019-02-17 11:08  Frontierone  阅读(308)  评论(0编辑  收藏  举报