背景:bfs专题的题,可是直接模拟就好了啊。
思路:管件在于记录第一个s12串,当再次出现第一个s12串时说明进入了循环之中,不能呢达到目标状态。
学习:1.strcmp时要注意,该字符串的有效部分是不是以'\0'结尾的。
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M 209
#define INF 100000000
#define LL long long int
using namespace std;
char a[M],b[M],over[M],c[M],key[M];
int n,ans;
void scan(char x[]){
for(int i=0;;i++){
char c=getchar();
if(c == '\n') return;
x[i]=c;
}
}
int bfs(void){
for(int k=1;;k++){
for(int i=0;i < 2*n;i++){
if(i%2 == 0) c[i]=b[i/2];
else c[i]=a[i/2];
}
#ifdef LOCALs
for(int i=0;i < 2*n;i++) printf("%c",c[i]);
printf("\n");
#endif // LOCAL
if(strcmp(c,over) == 0) return k;
if(k == 1)for(int i=0;i < 2*n;i++) key[i]=c[i];
if(k > 1 && !strcmp(c,key)) return 0;
for(int i=0;i < 2*n;i++){
if(i < n) a[i]=c[i];
else b[i-n]=c[i];
}
}
}
int main(void){
int t;
scanf("%d",&t);
for(int ij=1;ij <= t;ij++){
memset(over,'\0',sizeof(over));
memset(c,'\0',sizeof(c));
memset(key,'\0',sizeof(key));
scanf("%d%*c",&n);
scan(a);
scan(b);
#ifdef LOCALs
for(int i=0;i < n;i++) printf("%c",a[i]);
printf("\n");
#endif // LOCAL
scan(over);
printf("%d ",ij);
if(ans=bfs()) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}