csdn编程竞赛题:A、B两个单词通过一个单词集合Dict的最小路径
2013-07-20 16:31
337 查看
#include <iostream> #include <vector> #include <algorithm> using namespace std; /* 给了A、B两个单词和一个单词集合Dict,每个的长度都相同。 我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词中的一个字母, 同时,新产生的单词必须是在给定的单词集合Dict中。求所有行得通步数最少的修改方法。 举个例子如下: Given: A = "hit" B = "cog" Dict = ["hot","dot","dog","lot","log"] Return [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ] 即把字符串A = "hit"转变成字符串B = "cog",有以下两种可能: "hit" -> "hot" -> "dot" -> "dog" -> "cog"; "hit" -> "hot" -> "lot" -> "log" ->"cog"。 */ const int word_len = 3; // 单词固定长度 const int item_count = 7; // 单词项数 const char *words[item_count] ={"hit","hot","dot","dog","lot","log", "cog"}; vector<int> vec; vector<vector<int>> result_vec; // 保存路径结果 vector<int>::iterator iter; //两个单词之间是否相通 int linked(const char * str1, const char * str2) { if(str1==str2) return -1; // 完全相同 int different = 0; for(int i=0; i<word_len; ++i){ if( str1[i] != str2[i]){ ++different; } } return different==1? 1 : 0; //1 代表只有1个不同字母, 0 代表多于1个不同字母 } void getpath(int start, int end,vector<int> &vec) { vec.push_back(start); // 加入可能的路径 for(int i=0; i< item_count; ++i){ if(linked(words[start], words[i]) == 1 ){ if(linked(words[i], words[end]) == 1 ){// 是否target vec.push_back(i); vec.push_back(end); result_vec.push_back(vec); vec.pop_back(); vec.pop_back(); break; // 当前是最短路径, 不需要再往下找了 } // 查找是否已经包含当前的单词 iter = find(vec.begin(), vec.end(), i); if(iter == vec.end()){ int linked_count = 0; for(iter=vec.begin();iter<vec.end();++iter){ if(linked(words[*iter], words[i]) == 1){ linked_count++; } } if(linked_count==1){ // 列表中只能有1个单词和当前的单词相通,否则就不是最佳路径 getpath(i, end, vec); } } } } vec.pop_back(); //当前路径不通, 抛弃 } void find_path() { const int start = 0; const int end = 6; getpath(start,end, vec); // 输出结果 cout<<"Return [ "; for(vector<vector<int>>::iterator it= result_vec.begin();it!=result_vec.end();++it) { cout <<(it == result_vec.begin()?"[":", ["); for(iter = it->begin(); iter!=it->end(); ++iter){ cout<<(iter == it->begin()?"\"":",\"")<<words[*iter]<<"\""; } cout<<"]"; } cout <<" ]"<<endl; }
在线答题发送失败, 放在这里以便以后备查.
相关文章推荐
- JavaWeb基础 通过设置web.xml 实现一个servlet拥有两个浏览路径
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- 用DS播放一个视频时,如何通过编程知道GRAPH加载的FILTER的组件所在的路径??
- 现在,有两个整数A和B,例如A是345,B是478,现在,需要把B插入到A里, 而A有三位,所以有四个位置选择,所得结果分别是: 478345, 347845, 344785, 345478 我们通过对比可以知道,在这当中最小的一个是344785
- poj 3308 最小点权覆盖集, 见 胡驳涛论文里面有讲见图方法 二分图最小权点覆盖 我的想法是一个东西通过两个操作都可以完成,这些操作还可以完成其他的东西,每个操作有一个花费,现在要你选出花费最小的操作。这就是裸的模型
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
- 通过百度提供API接口获得同一个城市两个位置交通路线
- 编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,用空格来分隔单词(只使用循环,数组)
- 一道面试题:有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 如何将一个网络分为两个子网、如何通过已知IP和子网掩码计算其同一网段的主机IP
- 华为面试题 题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 编程题:输入一个正整数数组,将他们拼接成一个数,输出拼接出所有数字中最小的一个
- 7.4.采用穷举法,用函数编程实现计算两个正整数的最小公倍数的函数,在主函数中调用该函数计算并输出从键盘任意输入的两个数的最小公倍数。
- 11_5_1创建一个集合类People ,它是下述Person类的集合,该集合中的项可以通过一个字符串索引符来访问,该字符串索引符是人的姓名,与Person.Name 属性相同:
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 通过一个游戏编程熟悉线程操作
- 黑马程序员 :(反射应用 )通过反射讲<Integer>类型的集合中添加一个<String>类型的数据
- scala通过mkString方法把一个集合转化为一个字符串
- 一个中兴的面试题,输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解(c语言递归函数分解法)
- 算法:讲一个list拆分为两个list,并使两个list和的差的绝对值最小