您的位置:首页 > 编程语言

百度2017暑期实习生编程题:单词接龙

2016-07-22 18:23 330 查看
拉姆刚开始学习英文单词,对单词排序很感兴趣。

如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一单词的为字母相同。

你能编写一个程序来帮助拉姆进行判断吗?

输入描述:

输入包含多组测试数据。

对于每组测试数据,第一行为一个正整数n,代表有n个单词。

然后有n个字符串,代表n个单词。

保证:

2<=n<=200,每个单词长度大于1且小于等于10,且所有单词都是由小写字母组成。

输出描述:

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

输入例子:

3

abc

cdefg

ghijkl

4

abc

cdef

fghijk

xyz

输出例子:

Yes

No

解答:

如果将单词看成一条有向线段,那么问题就转换成了判断这些线段能否练成一个有向的欧拉通路。欧拉通路的判定方法为:除2个端点外其余节点入度=出度,1个端点入度比出度大1,一个端点入度比出度小1 ;或者,所有节点入度等于出度。

实现步骤:

1.先求出每个线段的入度和初度

2.判断以下条件是否成立:其中1个节点的入度比出度大1,另一个节点出度比入度大1,同时其他节点入度=出度。如果成立,就表明可以。

3.如果条件2不成立的话,就要判断是否所有节点入度=出度,同时要保证所有节点的入度和出度都不能为0。如果成立的话,就表明可以。

4.如果条件3不成立,就表明不行。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
bool isCorrect(vector<string> inStrs,int n) {
vector<int> inNums(n,0);//节点入度数
vector<int> outNum(n,0);//节点的出度数

for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i != j) {
//int lenIn =  inStrs[i].length();
int lenOut = inStrs[j].length();
if(inStrs[i][0] == inStrs[j][lenOut-1])
inNums[i]++;
}
}
}

for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i != j) {
int lenIn =  inStrs[i].length();
//int lenOut = inStrs[j].length();
if(inStrs[i][lenIn-1] == inStrs[j][0])
outNum[i]++;
}
}
}

int bigger = 0;//入度大于初度的节点的个数
int smaller = 0;//入度小于初度的节点的个数

bool InEqualToOut = true;//是否所有节点的入度数都和出度数相等
for(int i = 0; i < n; i++) {
if(inNums[i] == outNum[i]) {
if(inNums[i] == 0)
return false;
//如果某个节点的初度和入度都为0,那么必然无法形成欧拉图
continue;
}
else if(inNums[i] > outNum[i]) {
InEqualToOut = false;
if(inNums[i] - outNum[i] == 1)
bigger++;
else{
return false;
}

}
else if(inNums[i] < outNum[i]) {
InEqualToOut = false;
if(outNum[i] - inNums[i] == 1)
smaller++;
else{
return false;
}
}

}
if((bigger == 1 && smaller == 1) ||InEqualToOut)
return true;
else
return false;
}

int main() {
int n;
vector<string> inStrs;
string instring ;
while(cin>>n) {
for(int i = 0; i < n; i++) {
cin>>instring;
inStrs.push_back(instring);
}
if(isCorrect(inStrs,n))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  百度 编程 算法