hdu1181
来源:互联网 发布:风险控制矩阵图 编辑:程序博客网 时间:2024/06/02 18:01
这题有三种方法;分别是 深搜 广搜 查并集;
查并集的具体方法 见 :http://blog.csdn.net/free_shy/article/details/8665325
< 一 > :深搜:
//分析:用深搜 用一个结构体 记录每个单词的 首尾字母;
//不断用上一个的单词的尾字母 与下一个单词的首字母对比;;
// 知道找到符合条件的;
// 如果单个字母要作为单词的话 这个代码 就不能AC, 所以 这题并没有考虑这种情况;
//这题不需要“回溯”;如果第一次不符合;下一次再用到这个字母 就仍不符合;就没有意义;
#include<cstdio>#include<iostream>#include<cstring>using namespace std;int k;bool first;struct node//定义结构体;{ char st;// 首字母 char en;//为字母;}peo[1000];bool dfs(char ch){ if(first)//如果first 为真 就返回。它的上一循环 再进行下一次循环 也会结束;减少时间; return true; if(ch == 'm') { first = true; return true; } for(int i = 0; i < k; i++) { if(peo[i].st != '0' && peo[i].st == ch) { peo[i].st = '0'; dfs(peo[i].en); } }}int main(){ string str; while(cin >> str) { k = 0; first = false; while(str != "0") { int len = str.length(); peo[k].st = str[0]; peo[k].en = str[len-1]; k++; cin >> str; } dfs('b');//从“b”开始 if(first) { printf("Yes.\n"); } else printf("No.\n"); }}
< 二 > 查并集:
// 用查并集的方法做得;将每个单词的首尾字母分别放在两个数组中,然后用查并集的方法
//就行编排,最后在用查并集的 find 函数,找到 b 与 m的关系;
// 查并集主要是路径压缩,以减少时间;
#include<cstdio>#include<cstring>#include<iostream>#include<string>using namespace std;int tot1[1000];//记录单词的首字母;int tot2[1000];//记录单词的为字母;int make[30], b;int find(int x){ if(x != make[x])//一直找到x的最上面的数; { make[x] = find(make[x]); } return make[x];}void set(int x, int y){ int f1 = find(x); int f2 = find(y); if(f1!=f2) make[f1] = f2;//将f1连接在f2的下面;}int set_find(int a)//最后在查一下是否 符合条件;{ if(b == 1) return 1; if(a == 13) { b = 1; return 1; } if(a != make[a]) make[a] = set_find(make[a]);}int main(){ string str; while(cin >> str) { int k = 0; while(str != "0") { int len = str.length(); tot1[k] = str[0] - 'a' + 1; tot2[k] = str[len-1] - 'a' + 1; k++; cin >> str; } for(int i = 1; i <= 26; i++)//将它们初始化; { make[i] = i; } for(int i = 0; i < k; i++)//开始查并集; { set(tot1[i], tot2[i]); } b = 0; set_find(2);//检查是否符合条件; if(b == 1) printf("Yes.\n"); else printf("No.\n"); }}
< 三 >:广搜
//这是用广搜的方法;
//用一个结构体将单词的首尾 放入;为深搜做准备;
//用一个for循环找首字母为‘b’的;如果进行深搜 得不到结果,就继续找另一个‘b’;如果得到就跳出;
//在bfs函数中首先进行初始化;就是在主函数中找的的首字母为b的 进行;
//将temp压入队列;
//在while()中找到所有首字母为上一个元素的为字母的 元素 并压入队列;
//全部压入队列后,在从队列中找顶栈的元素;判断是否它的尾字母为m不 是就跳出 不是继续找
//所有的元素的首字母为上一个元素的尾字母 并压入队列;就这样一层一层的找,直到找到或没有
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<queue>using namespace std;bool first;int k;struct zm{ char st; char en;}peo[1000];bool bfs(int n){ queue<zm>q; //if(first) // return true; //if(ch == '') zm temp, type; temp.st = peo[n].st; temp.en = peo[n].en; peo[n].st = '0'; q.push(temp); while(!q.empty()) { temp = q.front(); q.pop(); if(temp.en == 'm') { first = true; break; } type = temp; for(int i = 0; i < k; i++) { if(peo[i].st != '0' && peo[i].st == temp.en) { type.st = peo[i].st; type.en = peo[i].en; peo[i].st = '0'; q.push(type); } } } if(first) return true; return false;}int main(){ string str; while(cin >> str) { first = false; k = 0; while(str != "0") { int len = str.length(); peo[k].st = str[0]; peo[k].en = str[len-1]; k++; cin >> str; } for(int i = 0; i < k; i++) { if(peo[i].st == 'b') { first = bfs(i); if(first) break; } } if(first) printf("Yes.\n"); else printf("No.\n"); }}
- hdu1181
- hdu1181
- hdu1181
- hdu1181
- HDU1181
- HDU1181
- hdu1181(DFS)
- hdu1181 变形课 dfs
- 变形课 hdu1181 图论
- HDU1181:变形课(DFS)
- hdu1181(变形课)
- HDU1181 变形课
- HDU1181:变形课(DFS)
- hdu1181 变形课
- HDU1181---变形课
- hdu1181 变形课【dfs】
- HDU1181:变形课 【dfs】
- hdu1181(变形课)
- 数据结构 递归讲解
- Video for Linux Two
- thinkpad 启虚拟化
- 图像处理资源
- 物理引擎Box2D之形状
- hdu1181
- 教你如何迅速秒杀掉:99%的海量数据处理面试题 .
- 物理引擎Box2D之关联及关联定义
- Android Camera TakePicture過程分析
- 筛选最后的值
- 【转载】java socket编程
- Android驱动使用JNI调用
- 手把手教你把Vim改装成一个IDE编程环境(图文)
- 物理引擎Box2D之链接