【题目描述】
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
【输入】
输入的第一行为一个单独的整数n(n≤20)表示单词数,以下n行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。
【输出】
只需输出以此字母开头的最长的“龙”的长度。
【输入样例】
5
at
touch
cheat
choose
tact
a
【输出样例】
23
#include<iostream>
#include<cstring>
using namespace std;
int n, length = 0, v[1000] = { 0 };
string str[1000];
int check(string a, string b)//求 符合接龙的长度,这部分不好理解
{
int p =(a.size()< b.size()?a.size():b.size());
for (int i = 1; a.size() == 1 ? i <= p : i < p; i++)
{
bool flag = true;
for (int j = 0; j < i; j++)
{
if (a[a.size() - i + j] != b[j])
{
flag = false;
break;
}
}
if (flag == true) return i;
}
return 0;
}
void search(string s,int now)
{
length = (length> now?length:now);
for (int i = 1; i <= n; i++)
{
if (v[i] > 1) continue;
else
{
int add = check(s, str[i]);//求重合,s的串<str[i]的串!
if (add != 0)
{
v[i]++;
search(str[i], now + str[i].size()- add);
v[i]--;//回溯
}
}
}
}
int main()
{
cin >> n; char ch;
for (int i = 1; i <= n; i++)
cin >> str[i];
cin >> str[n + 1];
search(str[n + 1], 1);
cout << length;
}
我是个菜鸡小白.
发布了14 篇原创文章 · 获赞 2 · 访问量 195
私信
关注