题意:给你3个字符串,然后两个字符串开始穿插组成字符串,如果能组成第三个字符串就输出重组了几次,若不能就把组成的新的字符串的前一半当成s1,后一半当成s2继续重组(重组时第一个为s2的第一个)。
题解:模拟=-=,虽然不知道为什么在搜索的分类里=-=。详情看代码注释。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char ss[1000][200]; // 利用strcmp函数来判重,所以开了二维字符串(可能这就是不会map的后果把)
int main(){
int z;
cin >> z;
int t = 1;
while(z--){
int m ;
int flag = 0;
char s1[200],s2[200],s[400];
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(s,0,sizeof(s));
memset(ss,0,sizeof(ss));
cin >> m >> s1 >> s2 >> s;
for(int i = 0; ; i ++){ //无限循环
for(int j = 0 ; j < m ; j ++)
ss[i][2*j] = s2[j];
for(int j = 0 ; j < m ; j ++)
ss[i][2*j+1] = s1[j]; //重组
if(strcmp(s,ss[i]) == 0){ //判断是否带到目标串
printf("%d %d\n",t,i+1);
break;
}
else {
for(int j = 0 ; j < i; j ++){
if(strcmp(ss[i],ss[j]) == 0){ //判重
printf("%d -1\n",t);
flag = 1;
break;
}
}
if(flag) break;
}
for(int j = 0 ; j < m ; j++){ //拆分s1 和 s2
s1[j] = ss[i][j];
s2[j] = ss[i][j+m];
}
}
t++;
}
return 0;
}