又是一道英语阅读题,题目并不难,用stl中的map就可以解决
那么先说题意:
有两堆相同数目但有不同记号的纸牌,你要进行洗牌要将s2中的纸牌插入到s1中每一张纸牌的下方,如图,然后再将s12分成两堆,上半部分为新的s2,下半部分为新的s1,如此往复,直到找到和题目要求相同的序列
思路:
如果在排列过程中出现两次相同的排列后的结果则可以判定题目要求的序列是找不到的
#include<stdio.h>
#include<string.h>
#include<map>
#include<string>
using namespace std;
int main()
{
int t,num;
num=0;
scanf("%d",&t);
while(t--)
{
map<string,bool> mp;
char s1[110]={0},s2[110]={0},s12[220]={0},mers[220]={0};
int n,flag,cnt;
scanf("%d",&n);
getchar();
gets(s1);
gets(s2);
gets(s12);
flag=0,cnt=1;
for(int i=0,j=0;i<n;i++)
{
mers[j++]=s2[i];
mers[j++]=s1[i];
}
mp[mers]=true;
while(strcmp(s12,mers)!=0)
{
cnt++;
strncpy(s1,mers,n);
strncpy(s2,mers+n,n);
memset(mers,0,sizeof(mers));
for(int i=0,j=0;i<n;i++)
{
mers[j++]=s2[i];
mers[j++]=s1[i];
}
if(mp[mers])
{
flag=1;
break;
}
}
if(flag)
printf("%d -1\n",++num);
else
printf("%d %d\n",++num,cnt);
}
return 0;
}