您的位置:首页 > 其它

HDU_1501_Zipper

2015-07-25 17:03 309 查看
Zipper这个名字很形象……

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: