百度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不成立,就表明不行。
如果给拉姆一组单词,他能够迅速确定是否可以将这些单词排列在一个列表中,使得该列表中任何单词的首字母与前一单词的为字母相同。
你能编写一个程序来帮助拉姆进行判断吗?
输入描述:
输入包含多组测试数据。
对于每组测试数据,第一行为一个正整数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; }
相关文章推荐
- 房产界已上市和IPO路上的难兄难弟:房天下与房多多
- 利用百度地图提供的API做的应用
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 百度20年:搜索帝国的崛起、式微与重生
- 肯特·贝克:改变人生的代码整理魔法
- 小白观察:Google 开始清除百度旗下公司开发的 46 款应用程序
- 你应该学习哪种编程语言?
- [转]我们需要一种其他人能使用的编程语言
- 书评:《算法之美( Algorithms to Live By )》
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)
- DB2编程序小小技巧
- DB2编程序技巧 (五)
- 动易2006序列号破解算法公布
- DB2编程序技巧 (一)