大意:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。现在输入s1和s2的初始状态 以及 预想的最终状态s12。问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"
思路:就是个字符串模拟题。
1 #include <stdio.h> 2 #include <string.h> 3 4 void Solve() 5 { 6 int n, m; 7 char s1[110], s2[110], s3[210], s4[210], s[210]; 8 scanf("%d", &n); 9 for(int p = 1; p <= n; p++) 10 { 11 memset(s, 'a', sizeof(s)); 12 scanf("%d%*c", &m); 13 scanf("%s%s%s", s1, s2, s3); 14 printf("%d ", p); 15 strcpy(s, s1); 16 strcat(s, s2); 17 strcpy(s4, s); 18 int t; 19 for(t = 0; strcmp(s, s3); t++) 20 { 21 for(int j = 0; j < m; j++) 22 { 23 s1[j] = s[j]; 24 s2[j] = s[j+m]; 25 } 26 int i, j; 27 for(i = 0, j = 0; i < m; i++, j+=2) 28 { 29 s[j] = s2[i]; 30 s[j+1] = s1[i]; 31 } 32 if(strcmp(s4, s) == 0) 33 { 34 t = -1; 35 break; 36 } 37 } 38 printf("%d ", t); 39 } 40 } 41 42 int main(void) 43 { 44 //freopen("data.in", "r", stdin); 45 Solve(); 46 47 return 0; 48 }