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

描述

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

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

 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <stdlib.h>
 6 #include <string>
 7 #include <memory>
 8 #include <queue>
 9
10 using namespace std;
11
12 struct word {
13     char words[7];
14     int step;
15     word() { step = 0; }
16 };
17 word diction[31];
18 word start, endw;
19 int num = 1;
20 bool visited[31];
21
22 queue<word>all;
23
24 int cmp(word&a, word&b) {
25     int count = 0;
26     int l = strlen(a.words);
27     for (int i = 0; i < l; i++)
28         if (a.words[i] != b.words[i])
29             count++;
30     return count;
31 }
32
33 void bfs() {
34     bool flag = false;
35     while (!all.empty()) {
36         word now = all.front();
37         all.pop();
38         for (int i = 1; i <= num; i++) {
39             if (visited[i] != 1 && cmp(now, diction[i]) == 1) {
40                 visited[i] = 1;
41                 diction[i].step = now.step + 1;
42                 if (cmp(diction[i], endw) == 1) {
43                     flag = true;
44                     printf("%d\n", diction[i].step + 2);
45                     return;
46                 }
47                 all.push(diction[i]);
48             }
49         }
50     }
51     if (flag == false)
52         printf("0\n");
53 }
54
55 int main()
56 {
57     cin >> start.words >> endw.words;
58     while (cin >> diction[num].words)
59         num++;
60     if (cmp(start, endw) == 1)
61     {
62         printf("2\n");
63         return 0;
64     }
65     all.push(start);
66     bfs();
67     return 0;
68 }

普通的广搜 注意开始单词和结束单词只差一个字母的情况

原文地址:https://www.cnblogs.com/yalphait/p/9125249.html

时间: 2024-10-08 13:46:49

18.06.02 POJ4128:单词序列 15年程设期末06的相关文章

18.06.26 16年程设期末10:游览规划

描述 一年一度的暴雪嘉年华(BlizzCon’16)即将盛大开幕,作为贪玩的助教小J,自然翘掉了程设期末前往参加.本届嘉年华为期m天,在这24*m小时的时间里,观众买券入场后方可体验各种免费及付费的游戏项目.参加本届嘉年华,首先需要在现场购买入场券,现场可以购买的入场券有三种,允许叠加购买使用: 单日券:售价100美金,购买后可以进入会场游玩24小时: 双日券:售价150美金,购买后可以进入会场游玩48小时: 三日券:售价200美金,购买后可以进入会场游玩72小时. 买券进入会场后,就可以在规定

循环-06. 统计一行文本的单词个数(15)

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main(){ 5 string s; 6 int i,c=0; 7 getline(cin,s); 8 for(i=1;i<s.length()-1;i++) 9 if(s[i]==' '&&s[i-1]!=' ') 10 c++; 11 if(s[i]!=' ') 12 c++; 13 cout<<c<

02:奇数单增序列 个人博客doubleq.win

个人博客doubleq.win 02:奇数单增序列 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出. 输入 共2行:第1行为 N:第2行为 N 个正整数,其间用空格间隔. 输出 增序输出的奇数序列,数据之间以逗号间隔.数据保证至少有一个奇数. 样例输入 10 1 3 2 6 5 4 9 8 7 10 样例输出 1,3,5,7,9 1 #include<iostream>

06-3. 单词长度(15)

你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束.你要输出每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4.注意,行中可能出现连续的空格:最后的‘.’不计算在内. 输入格式: 输入在一行中给出一行文本,以‘.’结束. 提示:用scanf("%c",...);来读入一个字符,直到读到‘.’为止. 输出格式: 在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格. 输入样例: It's great to

18 对话框02

Android详细的对话框AlertDialog.Builder使用方法 我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等方式,重写我们自己的对话框.当然,这也是不失为一个不错的解决方式,但是一般的情况却是这样,我们重写的对话框,也许只在一个特定的地方会用到,为了这一次的使用,而去创建一个新类,往往有点杀鸡用牛刀的感觉,甚至会对我们的程序增加不必

02:奇数单增序列

02:奇数单增序列 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出. 输入 共2行:第1行为 N:第2行为 N 个正整数,其间用空格间隔. 输出 增序输出的奇数序列,数据之间以逗号间隔.数据保证至少有一个奇数. 样例输入 10 1 3 2 6 5 4 9 8 7 10 样例输出 1,3,5,7,9 查看 提交 统计 提问 全局题号 6241 添加于 2014-10-22

Bentley.RAM.Structural.System.V8i.v14.06.02.00.Win32_64 1CD为建筑分析和设计工程解决方案

Bentley.RAM.Structural.System.V8i.v14.06.02.00.Win32_64 1CD为建筑分析和设计工程解决方案RAM Structural System 是唯一一款完全与钢结构和混凝土结构的整个建筑分析.设计和制图集成的工程软件解决方案!发动机及整车开发工具 GT-Suite.v7.4.Update.3.Only 1DVDCSimsoft.Trelis.Pro.v15.0.0.Win64 1CD有限元分析网格生成工具++++++++++++++++++++++

006:单词序列

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

单词序列

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