poj 3087 Shuffle'm Up ( map 模拟 )

题目:http://poj.org/problem?id=3087

题意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。

现在输入s1和s2的初始状态 以及 预想的最终状态s12

问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<iomanip>
 8 #include<cmath>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 using namespace std;
13 
14 int main()
15 {
16     int n,i,team,x=1,cnt,sum;
17     char a[250],b[250],c[450],t[450];
18     cin>>team;
19     while(team--)
20     {
21         cin>>n;
22         map<string,int>mp;
23         map<string,int>::iterator iter;
24         cin>>a>>b>>c;
25         mp[c]=2;
26         sum=0;
27         printf("%d ",x++);
28         while(1)
29         {
30             sum++;
31             cnt=0;
32             for(i=0; i<n; i++)
33             {
34                 t[cnt++]=b[i];
35                 t[cnt++]=a[i];
36             }
37             t[cnt]='\0';
38             if(mp[t]==2)
39             {
40                 cout<<sum<<endl;
41                 break;
42             }
43             if(mp[t]==1)
44             {
45                 cout<<"-1"<<endl;
46                 break;
47             }
48             mp[t]=1;
49             strncpy(a,t,n);
50             a[n]='\0';
51             strcpy(b,t+n);
52             b[n]='\0';
53         }
54     }
55     return 0;
56 }

 

posted @ 2013-08-27 09:57  水门  阅读(168)  评论(0编辑  收藏  举报