NOIP2000提高组 单词接龙

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1: 5 at touch cheat choose tact a

输出样例#1: 23           (连成的“龙”为atoucheatactactouchoose)  

这道题是一道字符串类型的搜索,从数据上可以看出直接暴力搜索就可以了。 主要的思路是以固定字符开头,然后逐个递归枚举调用数小于2的串进行匹配,如果可以就连上并看看是否能够更新最长,最后遍历出最结果。

上代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 int n,note[21],maxl;
 6 char a[21][21];
 7 bool can(int i,int j,int k){
 8     for(int p=0;p<=strlen(a[i])-j-1;p++)//字符串从0开始存 
 9         if(a[i][j+p]!=a[k][p]||p>=strlen(a[k])-1)
10             return 0;
11     return 1;
12 }
13 void dfs(int i,int j,int l){
14     if(l>maxl)
15         maxl=l;
16     for(int k=1;k<=n;k++)
17         if(note[k]<=1&&can(i,j,k)){
18             note[k]++;
19             for(int len=1;len<=strlen(a[k])-1;len++)//字符串从0开始存 
20                 dfs(k,len,l+strlen(a[k])-strlen(a[i])+j);
21             note[k]--;
22         }
23 }
24 int main(){
25     scanf("%d",&n);
26     for(int i=1;i<=n;i++)
27         scanf("%s",a[i]);
28     cin>>a[0][0];
29     dfs(0,0,1);
30     printf("%d",maxl);
31     return 0;
32 }

 

posted @ 2017-03-15 00:19  circlegg  阅读(546)  评论(0编辑  收藏  举报