题意:给你两堆牌s1,s2(字符串第一个是最下面的一张牌),牌数均为C,按照指定规则互相交叉组合为一堆牌s12(字符串第一个是最下面的一张牌),再将s12下面的C张牌归为s1(从下到上),剩下的为s2(从下到上)。依次循环,问是否能达到指定状态ans。
第一组样例变化如下:
/*
第一组样例
AHAH HAHA
H A
A H
H A
A H
第一次交叉组合:
HAAHHAAH
分为s1,s2。
HAAH HAAH
H H
A A
A A
H H
第二次交叉组合:
HHAAAAHH
*/
思路:模拟。每次出现过的状态放入set,一直按照规则变化即可,如果某种出现过的状态又出现了那么下面变化肯定都一样形成循环,就不可能有答案。
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<set>
using namespace std;
int C;
int main()
{
int T,CASE = 1;
scanf("%d", &T);
while (T--)
{
string s1, s2, ans, s12;
scanf("%d", &C);
cin >> s1 >> s2 >> ans;
bool flag = false;
int cnt = 0;
set<string> s;
s12 = s1 + s2;
while (!s.count(s12))
{
s.insert(s12);
s1.replace(0, C, s12.substr(0, C));
s2.replace(0, C, s12.substr(C, C));
s12 = "";
for(int i = 0; i < C; i++)
{
s12 = s12 + s2[i];
s12 = s12 + s1[i];
}
cnt++;
if(s12 == ans)
{
flag = true; break;
}
}
printf("%d ",CASE++);
if(flag) printf("%d\n", cnt);
else printf("-1\n");
}
return 0;
}