题目名称:Shuffle'm Up
题目链接:http://poj.org/problem?id=3087
题意:有两堆扑克 S1 ,S2,牌数均为C,将它们 一张S1一张S2 交叉合成一堆S12(如原图),
然后把S12分为上下两堆,各为C,把下面那堆给S12,上面给S2
现在输入S1和S2的初始状态 以及 预想的最终状态S12
问S1 S2经过多少次洗牌之后,最终能达到状态S12,若永远不可能相同,则输出"-1"。
思路:模拟题,,但网上有些是用搜索
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int main()
{
int n;
char s1[205],s2[205],s12[205];
while(scanf("%d",&n)!=EOF)
{
int cnt=0;
while(cnt<n)
{
int t;
cnt++;
map<string,bool> vis;
scanf("%d",&t);
scanf("%s%s%s",s1,s2,s12);
// vis[s12]=true;
int sum=0;
while(true)
{
char s[205];
int ss=0;
for(int i=0;i<t;i++) //洗牌,s1,s2是从下面面开始输入的,所以要倒着放
{
s[ss++]=s2[i];
s[ss++]=s1[i];
}
s[ss]='\0';
sum++;
if(!strcmp(s,s12)) //比较和目标是否一样
{
printf("%d %d\n",cnt,sum);
break;
}
else if(vis[s]) //判重,和目标状态不一样,说明达不到
{
printf("%d -1\n",cnt);
break;
}
vis[s]=true;
int i,k;
for(i=0;i<t;i++) //分拆出s1与s2
s1[i]=s[i];
s1[i]='\0';
for(k=0;i<2*t;i++,k++)
s2[k]=s[i];
s2[i]='\0';
}
}
}
return 0;
}