单词接龙

单词接龙
拉姆刚开始学习英文单词,对单词排序很感兴趣。
如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一单词的为字母相同。
你能编写一个程序来帮助拉姆进行判断吗?

输入描述:

输入包含多组测试数据。 对于每组测试数据,第一行为一个正整数n,代表有n个单词。 然后有n个字符串,代表n个单词。 保证: 2<=n<=200,每个单词长度大于1且小于等于10,且所有单词都是由小写字母组成。



输出描述:

对于每组数据,输出"Yes"或"No"


输入例子:
  3
  abc
  cdefg
  ghijkl
  4
  abc
  cdef
  fghijk
  xyz
  

输出例子:
  Yes
  No
  


#include<iostream>
#include<string>
#include<queue>
using namespace std;
int canArrangeWords(int num, string* arr)
{
	if (num<1 || num>100)
		return -1;
	queue<string> qs;
	for (int i = 0; i < num; i++)
	{
		qs.push(arr[i]);
		int len = arr[i].size();
		if (len<2 || len>100)
			return -1;
	}
	int count = 1;
	int count1 = 0;
	char head = qs.front().at(0);
	char end = qs.front().at(arr[0].size() - 1);
	qs.pop();
	while (!qs.empty() && (count + count1 <= num))
	{
		int len = qs.front().size();
		if (qs.front().at(0) == end)
		{
			end = qs.front().at(len - 1);
			qs.pop();
			count++;
		}
		else if (qs.front().at(len - 1) == head)
		{
			head = qs.front().at(0);
			qs.pop();
			count++;
		}
		else
		{
			qs.push(qs.front());
			qs.pop();
			count1++;
		}
	}
	if (count == num)
		return 1;
	return -1;
}
int main()
{
	int num;
	while (cin >> num)
	{
		getchar();
		string *s = new string[num];
		for (int i = 0; i < num;i++)
		{
			getline(cin,s[i]);
		}
		int res = canArrangeWords(num,s);
		if (res == 1)
			cout << "YES" << endl;
		else
			cout << "No" << endl;
	}
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asd199086/article/details/52356111
个人分类: 算法学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

单词接龙

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭