poj3087
题目名称: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; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.