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 }