您的位置:首页 > 其它

05:单词序列MOOC程序设计算法基础期末第五题

2018-12-02 17:39 155 查看

给出两个单词(开始单词和结束单词)以及一个词典。找出从开始单词转换到结束单词,所需要的最短转换序列。转换的规则如下:

1、每次只能改变一个字母

2、转换过程中出现的单词(除开始单词和结束单词)必须存在于词典中

例如:

开始单词为:hit

结束单词为:cog

词典为:[hot,dot,dog,lot,log,mot]

那么一种可能的最短变换是: hit -> hot -> dot -> dog -> cog,

所以返回的结果是序列的长度5;

注意:

1、如果不能找到这种变换,则输出0;

2、词典中所有单词长度一样;

3、所有的单词都由小写字母构成;

4、开始单词和结束单词可以不在词典中。

输入

共两行,第一行为开始单词和结束单词(两个单词不同),以空格分开。第二行为若干的单词(各不相同),以空格分隔开来,表示词典。单词长度不超过5,单词个数不超过30。

输出

输出转换序列的长度。

样例输入

[code]hit cog
hot dot dog lot log

样例输出

[code]5

bfs

AC代码:
 

[code]#include<iostream>
#include<vector>
#include<queue>
#include<map>
using namespace std;
bool judge(string a,string b){//判断两单词是否只是有一个字母不同
int cnt=0;
for(int i=0;i<a.size();++i) if(a[i]!=b[i]) ++cnt;
if(cnt==1) return true;
else return false;
}
int main()
{
string tmp,start,final;
vector<string> pq;//存中间单词
cin>>start>>final;
while(cin>>tmp) pq.push_back(tmp);
pq.push_back(final);//将目的单词推入
queue<string> yu;map<string,int> op;op的值代表在转换序列中的顺序
yu.push(start);op[start]=1;
int flag=0;
while(1){
if(!yu.empty()) tmp=yu.front(),yu.pop();
else break;
if(tmp==final) {flag=1;break;}
for(int i=0;i<pq.size();++i)
if(judge(pq[i],tmp)&&!op.count(pq[i])) yu.push(pq[i]),op[pq[i]]=op[tmp]+1;
}
if(flag) cout<<op[final];
else cout<<0;
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐