单词序列

题目描述

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

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

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

例如:

开始单词为:hit

结束单词为:cog

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

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

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

注意:

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

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

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

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

输入格式

共两行

第一行为开始单词和结束单词(两个单词不同),以空格分开。

第二行为若干的单词(各不相同),以空格分隔开来,表示词典。

输出格式

输出转换序列的长度。

样例

样例输入

hit cog
hot dot dog lot log

样例输出

5

数据范围与提示

30%的数据字符串长度≤4,字典里单词个数≤30,字母是'a'到'd';

60%的数据字符串长度≤6,字典里单词个数≤100,字母是'a'到'h';

100%的数据字符串长度≤8,字典里单词个数≤1000,字母是'a'到'z';

c++AC代码

#include<bits/stdc++.h>
using namespace std;
char sum1[10],sum2[10],a[1005][10];
int n;
bool vis[1005];
struct node{
	char sum[10];
	int num;
}t1,t2;
bool check(char x[],char y[]){
	int len=strlen(x),tot=0;
	for(int i=0;i<len;i++)if(x[i]!=y[i])tot++;
	if(tot<=1)return true;
	else return false;
}
inline void bfs(char sum[],int num){
	queue<node> q;
	int len=strlen(sum);
	for(int i=0;i<len;i++)t1.sum[i]=sum[i];
	t1.num=num;
	q.push(t1);
	while(!q.empty()){
		t1=q.front();
		q.pop();
		if(check(t1.sum,sum2)){
			printf("%d",t1.num);
			exit(0);
		}
		for(int i=1;i<=n;i++){
			if((!vis[i])&&check(a[i],t1.sum)==true){
				vis[i]=true;
				t2.num=t1.num+1;
				int _len=strlen(t1.sum);
				for(int j=0;j<_len;j++)t2.sum[j]=a[i][j];
				q.push(t2);
				//vis[i]=true;
			}
		}
	}
	printf("0");
}
int main(){
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);
	scanf("%s %s",sum1,sum2);
	while(scanf("%s",a[++n])!=EOF);
	n--;
	bfs(sum1,2);
	return 0;
}
posted @ 2021-03-16 20:43  黄逸飞重庆八中  阅读(126)  评论(0编辑  收藏  举报