其他分享
首页 > 其他分享> > 1220:单词接龙(感觉挺难的!!)

1220:单词接龙(感觉挺难的!!)

作者:互联网

【题目描述】
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如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 私信 关注

标签:1220,int,字母,单词,挺难,接龙,str,size
来源: https://blog.csdn.net/weixin_45988242/article/details/104200738