DFS--单词接龙

单词接龙

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

输入格式

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

输出格式

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

样例说明

连成的“龙”为 atoucheatactactouchoose

Sample Input

5
at
touch
cheat
choose
tact
a

Sample Output

23

代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>

using namespace std;
string s[110],strs;
int l[110],n,max1=0;
bool cha(string x,string y,int k)
{
    int lenx=x.length();
    for(int i=0;i<k;i++)
        if(x[lenx-k+i]!=y[i])//判断是否可以连接
        return false;//不可以
    return true;//可以
}
void cpy(string &x,string y,int k)
{
    int leny=y.length();
    for(int i=k;i<leny;i++)
        x+=y[i];//连接,k为链接点
}
void str(string strs)
{
    int w=strs.length();//判断当前单词长度
    max1=max(max1,w);//保存最大长度 ,最后输出
    for(int i=1;i<=n;i++)//重头判断单词是否可接
    {
        if(l[i]>=2)//判断是否用过两次
            continue;//用过两次跳过 
        for(int j=1;j<=s[i].length();j++)
        {//循环判断从哪里可接
          if(cha(strs,s[i],j))//判断是否可接
           {
				string t=strs;
				cpy(t,s[i],j);//连接
				if(t==strs) 
                continue;//与连接前长度一样跳过
				l[i]++;//标记使用次数
				str(t);//继续调用
				l[i]--;//回溯
           }
        }
    }
}
int main()
{
	scanf("%d",&n);//单词数
	for(int i=1;i<=n;i++) 
        cin>>s[i];//每行单词
	cin>>strs;//“龙”开头的字母
	str(strs);// 函数判断是否可链接
	printf("%d",max1);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值