006:单词序列

006:单词序列

题目链接:http://cxsjsxmooc.openjudge.cn/2017t2summerfinal/006/

总时间限制:
1000ms
内存限制:
1024kB
描述

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

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

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

例如:

开始单词为:hit

结束单词为:cog

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

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

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

注意:

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

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

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

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

输入
共两行,第一行为开始单词和结束单词(两个单词不同),以空格分开。第二行为若干的单词(各不相同),以空格分隔开来,表示词典。单词长度不超过5,单词个数不超过30。
输出
输出转换序列的长度。
样例输入
hit cog
hot dot dog lot log
样例输出
5思路:广度优先搜索 需要构造一个词典(注意词典 内 单词的输入)
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std ;
#define maxn 10
int total ; // 字典 中单词 数量  

char str11[maxn] , str22[maxn] ;
char zidian[40][maxn] ;
int visit[40] ;
int len ;
bool check(char str1[] , char str2[]  ){//相差一个字母返回真
    int flag = 0 ;
    for(int i=0 ; i<len ; i++){
        if(str1[i] != str2[i]){
            flag ++ ;
        }
    }
    if(flag == 1)
        return true ;
    return false ;
}

typedef struct node {
    char st[10] ;
    int step ;
}Lnode ;
queue<Lnode>Q ; 

void DFS(char *str , int step){
    Lnode trun ;
    strcpy(trun.st , str) ;
    trun.step = step ;
    Q.push(trun) ; 

    while(!Q.empty()){
        Lnode p = Q.front() ;
        Q.pop() ;
        if(check(p.st , str22)){//  模式串 到 目标串 差一个字母 (输出 +2 加上 开始单词 和 终止单词)
            printf("%d\n" , p.step+2) ;
            return;
        }
        for(int i=0 ; i<total ; i++){
            if(check(p.st , zidian[i])&&!visit[i]){
                visit[i] = 1 ;
                Lnode q ;
                strcpy(q.st , zidian[i]) ;
                q.step = p.step + 1 ;
                Q.push(q) ;
            }
        }
    }
    printf("0\n") ;//  不能达到  (如果不能找到这种变换,则输出0)
    return;
} 

int main(){
    while(~scanf("%s %s" , str11 , str22)){
        total = 0 ;
        len = strlen(str11) ;
        char ch ;
        while(~scanf(" %s" , zidian[total++] )) {
            ch = getchar() ;
            if(ch==‘ ‘) // 不知为什么 if(ch == ‘\n‘) break ; 有问题...
                continue ;
            else
                break ;
        } 

        memset(visit , 0 , sizeof(visit)) ;
        DFS(str11 , 0 ) ;
    }
    return 0 ;
}  

时间: 2024-11-09 00:05:28

006:单词序列的相关文章

单词序列

题目链接 总时间限制:  1000ms 内存限制:  1024kB 描述 给出两个单词(开始单词和结束单词)以及一个词典.找出从开始单词转换到结束单词,所需要的最短转换序列.转换的规则如下: 1.每次只能改变一个字母 2.转换过程中出现的单词(除开始单词和结束单词)必须存在于词典中 例如: 开始单词为:hit 结束单词为:cog 词典为:[hot,dot,dog,lot,log,mot] 那么一种可能的最短变换是: hit -> hot -> dot -> dog -> cog,

条件随机场——时间序列(句子单词序列也算),其特征函数必须要考虑前一刻的数据

摘自:https://www.zhihu.com/question/35866596/answer/139485548 用一个活生生的例子来说明条件随机场的,十分的通俗易懂!原文在这里 [Introduction to Conditional Random Fields] 假设你有许多小明同学一天内不同时段的照片,从小明提裤子起床到脱裤子睡觉各个时间段都有(小明是照片控!).现在的任务是对这些照片进行分类.比如有的照片是吃饭,那就给它打上吃饭的标签:有的照片是跑步时拍的,那就打上跑步的标签:有的

18.06.02 POJ4128:单词序列 15年程设期末06

描述 给出两个单词(开始单词和结束单词)以及一个词典.找出从开始单词转换到结束单词,所需要的最短转换序列.转换的规则如下: 1.每次只能改变一个字母 2.转换过程中出现的单词(除开始单词和结束单词)必须存在于词典中 例如: 开始单词为:hit 结束单词为:cog 词典为:[hot,dot,dog,lot,log,mot] 那么一种可能的最短变换是: hit -> hot -> dot -> dog -> cog, 所以返回的结果是序列的长度5: 注意: 1.如果不能找到这种变换,则

九章算法面试题25 反转单词序列

九章算法官网-原文网址 http://www.jiuzhang.com/problem/25/ 题目 将一个句子中的单词逆序排列.要求使用O(1)的额外存储空间.如I Love You逆序之后是You Love I 解答 定义操作Reverse(start, end),该操作可以使用O(1)的额外空间将start-end这段字符逆序.那么方法是,先将整个字符串反转,然后再遍历每个单词,将每个单词单独反转. 面试官角度 这个题目可能你还会想到其他的解法.但是这个解法是面试官想要的.这个题目还会要求

noi4_7_8468[单词序列]

爆搜都能过……我佩服它的数据规模 uses math; var f:array[1..10000] of boolean; a:array[1..100] of string[6]; n:longint; start,final:string[6]; ans:longint; function cj(a,b:string):boolean; var k,i:longint; begin k:=0; for i:=1 to length(a) do if a[i]<>b[i] then inc(

给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列

问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"] 返回 [ ["hit","hot",&

10:单词排序

10:单词排序 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次.(区分大小写) 输入 一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔.数据不含除字母.空格外的其他字符. 输出 按字典序输出这些单词,重复的单词只输出一次. 样例输入 She wants to go to Peking University

AC日记——单词的长度 openjudge 1.7 24

24:单词的长度 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度. 注意,如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分.没有被空格间开的符号串,都算作单词. 输入 一行单词序列,最少1个单词,最多300个单词,单词之间用至少1个空格间隔.单词序列总长度不超过1000. 输出 依次输出对应单词的长度,之间以逗号间隔. 样例输入 She was born in 1990-01-02

自然语言处理第二讲:单词计数

自然语言处理:单词计数 这一讲主要内容(Today): 1.语料库及其性质: 2.Zipf 法则: 3.标注语料库例子: 4.分词算法: 一. 语料库及其性质: a) 什么是语料库(Corpora) i. 一个语料库就是一份自然发生的语言文本的载体,以机器可读形式存储: ii. 一种平衡语料库尝试在语言或者其他领域具有代表性: b) 译者注:平行语料库与平衡语料库的特点与区别 i. 平行语料库通常是由双语或多语的对应语料构成,常常是翻译文本构成.例如:Babel English-Chinese