大致题意为:给你两个序列s1, s2, 给你一个要求的最终序列s3
将s2的最后一张牌放牌底,然后s1最后一张,s2,s1 直至全部放完形成最后序列
然后如果能达到最后序列的成果,就打印合成次数
不能就打印-1。
脑洞:先想到怎么判断不能。那就是出现循环的时候,因为两个给定的序列,会合成唯一一个合成序列,而一个已知的合成序列,就能分成两个确定的序列,所以如果不能,就一定会出现循环,毕竟排列组合种类是有限的。
然后就是模拟了。然后 算搜索嘛?
string s1,s2,s12,vis_s,s_tgt;//s1, s2, s12, 标记s查循环, 目标序列
int N, c, step;
void Init(){
s1 = "";s2 = ""; s12 = ""; vis_s = "";s_tgt = "";
c = 0;step = 0;
}
int main(){
cin >> N;
for (int i=1; i<=N; i++){
Init();
cin >> c;
cin >> s1 >> s2 >> s_tgt;
bfs(i);
}
return 0;
}
void bfs(int pos){
while (1) {
s12 = "";
for (int i=0; i<c; i++){//合体
s12 = s12 + s2[i];
s12 = s12 + s1[i];
}
if (step == 0) vis_s = s12;//把第一次合成的序列当作标记序列
step ++;
if (s12 == s_tgt) {
cout << pos << " " << step << endl;
break;
}
//分开
s1 = "" ; s2 = "";
for (int i=0; i<c; i++) s1 = s1 + s12[i];
for (int i=c; i<c*2; i++) s2 = s2 + s12[i];
if (step == 1) continue;
if (vis_s == s12){
cout << pos << " " << "-1" << endl;
break;
}
}
}