题意:给定长度都为C两个字符串,S1,S2,和一个要求的结果字符串S12。先把 S2 的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到新的S12,再把S12最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到目标字符串S,问最少需要几步。
#include<iostream>
#include<queue>
#include<map>
#include<cstring>
#include<string>
using namespace std;
string s1,s2,s12;
int C;
int count1;
string yeild1(string &s1,string &s2){
string temp;
int i;
for(i=0;i<2*C;i++){
if(i%2==0)temp+=s2[i/2];
else temp+=s1[i/2];
}
return temp;
}
void bfs(){
map<string,int>map1;
queue<string>q;
string temp=yeild1(s1,s2);
map1[temp]++;
q.push(temp);
while(!q.empty()){
string u=q.front();
q.pop();
if(u==s12){
cout<<++count1<<" "<<map1[u]<<endl;
return ;
}
s1=u.substr(0,C); //分解子串,参数一;起始位置,参数二:个数(可省略)
s2=u.substr(C);
string v=yeild1(s1,s2);
if(!map1.count(v)){
q.push(v);
map1[v]=map1[u]+1;
}
}
cout<<++count1<<" "<<-1<<endl;
}
int main(){
int N;
cin>>N;
count1=0;
while(N--){
cin>>C;
cin>>s1>>s2>>s12;
bfs();
}
return 0;
}