Live2D
博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

6.12考试 T1 单词序列

单词序列

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

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

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

例如:

开始单词为:hit

结束单词为:cog

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

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

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

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

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

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

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

【输入文件】共两行,第一行为开始单词和结束单词(两个单词不同),以空格分开。第二行为若干的单词(各不相同),以空格分隔开来,表示词典。

单词长度不超过5,单词个数不超过30。

【输出文件】输出转换序列的长度。

输入样例1:

hit cog
hot dot dog lot log

输出样例1:

5

该题其他输入输出数据:https://share.weiyun.com/5tpaeKV

思路:

广搜。

1、如果当前单词与结束单词差异度为0,直接输出当前深度,return 0;

2、’如果当前单词与正在搜索的单词差异度为1,那我们就把该单词加入队列中,深度为父节点的深度+1;

3、如果当前深度大于总单词数,则证明无法找到一条路径转换到结束单词。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int n,num=1;
char s[38][6],be[6];
char w[200008][6];
int h=1,t=0;
int deep[200008];

int fc(char a[],char b[])
{
    int cnt=0;
    for(int i=0;i<n;++i)
    {
        if(a[i]!=b[i]) cnt++;
        else continue;
    }
    return cnt;
}

int main()
{
    freopen("word.in","r",stdin);
    freopen("word.out","w",stdout);
    scanf("%s",be);
    n=strlen(be);
    while(~scanf("%s",s[num])) num++;
    num--;
    t++;
    deep[t]=1;
    strcpy(w[t],be);
    while(h<=t)
    {
        if(deep[h]>num+2) break; 
        if(fc(w[h],s[1])==0)
        {
            printf("%d",deep[h]);
            return 0;
        }
        for(int i=1;i<=num;++i)
        {
            if(fc(w[h],s[i])==1)
            {
                t++;
                strcpy(w[t],s[i]);
                deep[t]=deep[h]+1;
            }
            else continue;
        }
        h++;
    }
    printf("%d",0);
    return 0;
} 

 

posted @ 2019-06-12 14:45  _hhs  阅读(387)  评论(0)    收藏  举报