HDU1501 Zipper(DFS)
2016-07-24 15:04
477 查看
Zipper
Problem Description
Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.For example, consider forming "tcraete" from "cat" and "tree":
String A: cat
String B: tree
String C: tcraete
As you can see, we can form the third string by alternating characters from the two strings. As a second example, consider forming "catrtee" from "cat" and "tree":
String A: cat
String B: tree
String C: catrtee
Finally, notice that it is impossible to form "cttaree" from "cat" and "tree".
Input
The first line of input contains a single positive integer from 1 through 1000. It represents the number of data sets to follow. The processing for each data set is identical. The data sets appear on the following lines, one data set perline.
For each data set, the line of input consists of three strings, separated by a single space. All strings are composed of upper and lower case letters only. The length of the third string is always the sum of the lengths of the first two strings. The first two
strings will have lengths between 1 and 200 characters, inclusive.
Output
For each data set, print:Data set n: yes
if the third string can be formed from the first two, or
Data set n: no
if it cannot. Of course n should be replaced by the data set number. See the sample output below for an example.
Sample Input
3 cat tree tcraete cat tree catrtee cat tree cttaree
Sample Output
Data set 1: yes Data set 2: yes Data set 3: no
——————————————————————————————————————————
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int k1,k2,k3; char s1[1000],s2[1000],s3[1000]; int vir[1000][1000]; int flag; void dfs(int a,int b,int c) { if(flag) return; if(c==k3) { flag=1; return; } if(vir[a][b]==1) return; vir[a][b]=1; if(s1[a]==s3[c]) dfs(a+1,b,c+1); if(s2[b]==s3[c]) dfs(a,b+1,c+1); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf(" %s %s %s",s1,s2,s3); k1=strlen(s1); k2=strlen(s2); k3=strlen(s3); flag=0; memset(vir,0,sizeof(vir)); dfs(0,0,0); printf("Data set %d: ",i); if(flag) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- 数据库系统事务隔离级别
- Avro:使用Avro MapReduce进行排序
- 网络虚拟化之FlowVisor:网络虚拟层(下)
- c++设计模式之桥接模式
- 多线程实现(Thread类)
- 373. Find K Pairs with Smallest Sums
- 排序_2.快速排序
- MPAndroidChart使用二之折线图
- PAT-B 1023. 组个最小数 (20)
- 【转】Win32下的socket编程
- SQL-Server使用点滴(一-数据对象篇)
- 1块钱一瓶水,4个盖子换一瓶水,150块能喝多少水
- hdu 5187(高精度快速幂)
- HTTP报文
- STM32学习-定时器中断实验
- 解决windows,linux启动问题
- 共享的未来:Pydio 与 ownCloud 的联合
- 基于v4l2的视频监控
- Power of Three
- MPAndroidChart使用一之圆饼图