您的位置:首页 > 其它

poj 3087 Shuffle'm Up ( map 模拟 )

2013-08-27 09:57 417 查看
题目: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<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<iomanip>
#include<cmath>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
int n,i,team,x=1,cnt,sum;
char a[250],b[250],c[450],t[450];
cin>>team;
while(team--)
{
cin>>n;
map<string,int>mp;
map<string,int>::iterator iter;
cin>>a>>b>>c;
mp[c]=2;
sum=0;
printf("%d ",x++);
while(1)
{
sum++;
cnt=0;
for(i=0; i<n; i++)
{
t[cnt++]=b[i];
t[cnt++]=a[i];
}
t[cnt]='\0';
if(mp[t]==2)
{
cout<<sum<<endl;
break;
}
if(mp[t]==1)
{
cout<<"-1"<<endl;
break;
}
mp[t]=1;
strncpy(a,t,n);
a
='\0';
strcpy(b,t+n);
b
='\0';
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: