Language: Default Shuffle‘m Up
Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. The actual shuffle operation is performed by interleaving a chip from S1 with a chip from S2 as shown below for C = 5: The single resultant stack, S12, contains 2 * C chips. The bottommost chip of S12 is the bottommost chip from S2. On top of that chip, is the bottommost After the shuffle operation, S12 is split into 2 new stacks by taking the bottommost C chips from S12 to form a new S1 and the topmost C chips For this problem, you will write a program to determine if a particular resultant stack S12 can be formed by shuffling two stacks some number of times. Input The first line of input contains a single integer N, (1 ≤ N ≤ 1000) which is the number of datasets that follow. Each dataset consists of four lines of input. The first line of a dataset specifies an integer C, (1 ≤ C ≤ 100) which is the number of chips in each initial stack (S1 and S2). Output Output for each dataset consists of a single line that displays the dataset number (1 though N), a space, and an integer value which is the minimum number of shuffle operations required to get the desired resultant stack. If the Sample Input 2 4 AHAH HAHA HHAAAAHH 3 CDE CDE EEDDCC Sample Output 1 2 2 -1 Source |
题意:
已知两堆牌s1和s2的初始状态,其牌数均为c,依次交替叠放组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。
现在输入s1和s2的初始状态 以及最终状态s12
问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"。直接模拟过程即可。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define maxn 1005 #define MAXN 2005 #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 typedef long long ll; using namespace std; int main() { int N,C,cas=1; char s1[110],s2[110],str[222],s[222]; scanf("%d",&N); while (N--) { map<string,int>q; scanf("%d",&C); scanf("%s%s%s",s1,s2,str); bool ok=true; int ans=0; while (1) { int num=0,len1=0,len2=0; while (num<2*C) { if (num%2) s[num++]=s1[len1++]; else s[num++]=s2[len2++]; } s[num]='\0'; ans++; if (strcmp(str,s)==0) break; if (q[s]) { ok=false; break; } q[s]=1; for (int i=0;i<C;i++) s1[i]=s[i]; s1[C]='\0'; for (int i=C;i<2*C;i++) s2[i-C]=s[i]; s2[C]='\0'; } if (ok) printf("%d %d\n",cas++,ans); else printf("%d -1\n",cas++); } return 0; } /* 2 4 AHAH HAHA HHAAAAHH 3 CDE CDE EEDDCC */
Shuffle'm Up (poj 3087 模拟)