您的位置:首页 > 其它

poj 3087 直接模拟

2017-01-18 20:48 393 查看
这个题数据比较水。。。然后题目比较难看懂。意思就是,s1,和s2两堆牌,然后先s2一张再s1,最后会出现一个s12序列,例如s1 AHAH

S2 HAHA 然后s12为HAAHHAAH,然后前面一部分给s1,后面一部分给s2,然后再重复操作。最后看能否达到目标序列。

为什么说数据水呢,因为直接若操作次数大于于100,然后就可以判断不能达到了。大牛的做法是经过了一些操作后看s1是否等于刚开始输入的序列,若等于,则不能达到。

然后这个代码要注意的一点是初始化,,,如果s12不初始化的话,很有可能会WA;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 505
char s1[maxn];
char s11[maxn];
char s22[maxn];
char s2[maxn];
char s12[maxn*2];
char s21[maxn*2];
int main()
{
int N;
scanf("%d",&N);
int temp=N;
while(N--)
{
int n;
memset(s1,0,sizeof(s1));//注意这里的初始化
memset(s11,0,sizeof(s11));
memset(s2,0,sizeof(s2));
memset(s22,0,sizeof(s22));
memset(s12,0,sizeof(s12));
memset(s21,0,sizeof(s21));
scanf("%d",&n);
scanf("%s",s1);
scanf("%s",s2);
scanf("%s",s21);
int flag=1;
for(int i=0;i<2*n;i=i+2)
{
s12[i]=s2[i/2];
s12[i+1]=s1[i/2];
}
for(int i=0;i<n;i++)
s11[i]=s1[i];
for(int i=0;i<n;i++)
s22[i]=s2[i];
while(strcmp(s21,s12)!=0)
{
flag++;
for(int i=0;i<n;i++)
s1[i]=s12[i];
for(int i=0;i<n;i++)
s2[i]=s12[n+i];
for(int i=0;i<2*n;i=i+2)
{
s12[i]=s2[i/2];
s12[i+1]=s1[i/2];
}
if(strcmp(s11,s1)==0)
{

9cb3
flag=-1;
break;
}
}
printf("%d ",temp-N);
printf("%d\n",flag);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: