大意:
已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。现在输入s1和s2的初始状态 以及 预想的最终状态s12。问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"
思路:就是个字符串模拟题。
1 #include2 #include 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\n", t);39 }40 }41 42 int main(void)43 {44 //freopen("data.in", "r", stdin);45 Solve();46 47 return 0;48 }