Description
给定长度都为C两个字符串S1,S2,和一个要求的结果字符串SS。先把S2的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到S,再把S最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到SS,需要几步这样的过程
Input
多组用例,第一行为用例组数test,每组用例第一行为S1,S2长度,之后三行分别输入S1,S2,SS
Output
对于每组用例,输出该过程步数,如果不能到达目的则输出-1
Sample Input
2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC
Sample Output
1 2
2 -1
Solution
简单模拟,如果在操作几次之后出现前面已经出现过的状态则陷入循环显然不可能到达目标状态,输出-1
Code
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
using namespace std;
int main()
{
int test,c,i,k;
int t=0;
cin>>test;
while(++t<=test)
{
cin>>c;
char s1[201];
char s2[201];
char s12[401];
cin>>s1>>s2>>s12;
map<string,bool>vist;//记录某状态是否出现过
vist[s12]=true;
int step=0;//初始化步数
while(true)
{
char s[201];
int ps=0;
for(i=0;i<c;i++)//叠放
{
s[ps++]=s2[i];
s[ps++]=s1[i];
}
s[ps]='\0';//注意'\0'
step++;//步数加一
if(!strcmp(s,s12))//达到目的状态
{
cout<<t<<' '<<step<<endl;
break;
}
else if(vist[s]&&strcmp(s,s12))//出现循环而且没有达到目的状态
{
cout<<t<<' '<<-1<<endl;
break;
}
vist[s]=true;//将该状态记录
for(i=0;i<c;i++)//取出下半段复制给s1
s1[i]=s[i];
s1[i]='\0';
for(k=0;i<2*c;i++,k++)//取出上半段复制给s2
s2[k]=s[i];
s2[i]='\0';
}
}
return 0;
}