题目链接:POJ3087
思路,就是模拟,
要注意的细节,每次用字符串的时候要记得清空。
记录初始s12,如果找不到答案,第二次遍历s12的时候退出循环。
AC代码:
#include<stdio.h>
#include<string>
#include<iostream>
#include<queue>
using namespace std;
int T,n,kase;
string s1,s2,s,t,e;
void bfs(){
queue<string> q;
int cnt=0;
t.clear();
for(int i=0;i<s1.size();i++){
t+=s2[i];
t+=s1[i];
}
// cout<<t<<endl;
q.push(t);
// printf("limit=%d\n",limit);
while(!q.empty()){
cnt++;
t.clear();
t=q.front();
// cout<<t<<endl;
q.pop();
if(t.compare(s)==0){
printf("%d %d\n",kase,cnt);
return;
}
//if(cnt>1e5) break;
if(t.compare(e)==0) break;//如果等于起始串 退出 否则会死循环
// else cout<<t<<"<=>"<<e<<endl;
int len=t.size();
s1=t.substr(0,len/2);
s2=t.substr(len/2,len);
t.clear();
for(int i=0;i<s1.size();i++){
t+=s2[i];
t+=s1[i];
}
q.push(t);
}
printf("%d -1\n",kase);
return;
}
int main(){
scanf("%d",&T);
for(int i=0;i<T;i++){
kase=i+1;
scanf("%d",&n);
s1.clear();
s2.clear();
s.clear();
cin>>s1>>s2>>s;
e.clear();
e+=s1;
e+=s2;
//cout<<e<<endl;
bfs();
}
/*test string*/
/*
string s1="ABCD";
string s2="EFGH";
string s;
for(int i=0;i<s1.size();i++){
s+=s2[i];
s+=s1[i];
}
cout<<s<<endl;
*/
return 0;
}