您的位置:首页 > 其它

hdu 1501 Zipper

2011-05-01 04:34 323 查看
//这道题的常规做法是深搜。我这种方法有点深搜的思想,优点是不需要N^2的标记数组,但是代码量有点大,可改进。

#include<iostream>
using namespace std;

char ch[2][205],ch3[405];
int len1,len2;

bool tangle(int i,int j,int k,int lasti,int lastj)
{

while(i<len1||j<len2)
{
if(ch[0][i]==ch3[k])
{
if(ch[1][j]==ch3[k]){
lasti=i++,lastj=j++,k++;
while(ch[0][i]==ch[1][j]&&ch[1][j]==ch3[k])
i++,j++,k++;
if(ch[0][i]==ch3[k])
{
if(tangle(i+1,lastj,k+1,lasti,lastj))
return true;
if(ch[0][lasti]==ch3[k])
i=lasti+1;
else
return 0;
}
else if(ch[1][j]==ch3[k]){
if(tangle(lasti,j+1,k+1,lasti,lastj))
return true;
if(ch[1][lastj]==ch3[k])
j=lastj+1;
else
return 0;
}
else
{
if(ch[0][lasti]==ch3[k]){
if(tangle(i,lastj+1,k+1,lasti,lastj))
return true;
i=lasti+1;
}
else
return 0;
}
}
else
i++;
}
else if(ch[1][j]==ch3[k])
{
++j;
}
else
return 0;
k++;
}
return 1;
}
int main()
{
int n,i,j,k,t,lasti,lastj,last;
cin>>n;
t=0;
while(n--)
{
scanf("%s%s%s",ch[0],ch[1],ch3);
lasti=lastj=0;
last=-1;i=0,j=0,k=0;
len1=strlen(ch[0]),len2=strlen(ch[1]);
if(!tangle(i,j,k,lasti,lastj))
cout<<"Data set "<<++t<<": no"<<endl;
else
cout<<"Data set "<<++t<<": yes"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: