HDU_1501_Zipper
2015-07-25 17:03
309 查看
Zipper这个名字很形象……
s1 s2两个序列不改变顺序交替构成s3
dfs的题目因为深度是固定的,而找到结果就可以弹出。
不过我用bfs居然过了……
以下为bfs。
s1 s2两个序列不改变顺序交替构成s3
dfs的题目因为深度是固定的,而找到结果就可以弹出。
不过我用bfs居然过了……
以下为bfs。
#include <iostream> #include <stdio.h> #include <queue> #include <string.h> using namespace std; const int M=205; char s1[M],s2[M],s3[2*M]; int isu[M*M]; //是否访问过x,M*y的情况 int f; queue<int>re; void clearu() //清空 { for(int i=0;i<M*M;i++) //这里的范围记得改; { isu[i]=0; } } void bfs(int l3) { while(!re.empty()) re.pop(); //方便使用从1开始 int p=1; if(s1[1]==s3[1]) { isu[1]=1; re.push(1); } if(s2[1]==s3[1]) { isu[M]=1; re.push(M); } while(!re.empty()) { int t=re.front(); re.pop(); int cx=t%M,cy=t/M; p=isu[t]+1; //cout<<cx<<" "<<cy<<" "<<t<<endl; if(s1[cx+1]&&!isu[t+1]&&s1[cx+1]==s3[p]) { re.push(t+1); isu[t+1]=p; if(p==l3) { f=1; return; } } if(s2[cy+1]&&!isu[t+M]&&s2[cy+1]==s3[p]) { re.push(t+M); isu[t+M]=p; if(p==l3) { f=1; return; } } } } int main() { int t; scanf("%d",&t); for(int i=1;i<=t;i++) { f=0; clearu(); scanf("%s%s%s",s1+1,s2+1,s3+1); int l3=strlen(s3+1); bfs(l3); printf("Data set %d: ",i); if(f) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- hdu2203 KMP水的问题
- 计算所有数字的和(中等)
- [leetcode] 215.
- VS开发平台的生成后事件
- glVertexAttribPointer参数意义说明
- Codeforces 301_div.2_Ice Cave(BFS走冰块)
- 深入理解Java对象序列化
- 編程之美2.9:神奇的菲波那契數列
- javascript页面倒计时实例
- 数的双亲表示法结点结构定义
- poj 2886
- POJ 3255 Roadblocks
- 5. openCV中常用函数学习
- 吃甘蔗(中等,模拟)
- HDU 5301 Buildings 建公寓(逻辑,水)
- Myeclipse2014 激活 (包括方法和工具)
- Android 启动过程分析--笔记缩减
- 南阳 oj 表达式求值 题目35 数据结构 NYOj
- jquery中的工具方法$.isFunction, $.isArray(), $.isWindow()
- NDK编程中如何在C文件中打印调试信息