题目链接:
http://poj.org/problem?id=3087
题意:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。
现在输入s1和s2的初始状态 以及 预想的最终状态s12
问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出”-1”。
题解:
这还有个啥题解。。。暴力模拟吧。。。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
int T,c,step;
map<string,bool>vis;
char s1[205],s2[205],s12[405];
int main()
{
scanf("%d",&T);
for (int t=1;t<=T;t++)
{
vis.clear();
scanf("%d",&c);
scanf("%s",s1);
scanf("%s",s2);
scanf("%s",s12);
step=0;
while(1)
{
char tmp[405];
int num=0;
for (int i=0;i<c;i++)
{
tmp[num]=s2[i];num++;
tmp[num]=s1[i];num++;
}
tmp[num]='\0';
step++;
if (!strcmp(tmp,s12))
{
printf("%d %d\n",t,step);
break;
}
if (vis[tmp]==1)
{
printf("%d -1\n",t);
break;
}
vis[tmp]=1;
for (int i=0;i<c;i++)
s1[i]=tmp[i];
for (int i=0;i<c;i++)
s2[i]=tmp[i+c];
s1[c]='\0';
s2[c]='\0';
}
}
}