题意:
给定两个字符串 s1,s2 ,大小为c, 按照图片的方式结合成 s12 (大小为2*c),在给定一个result(等同于s12)字符串,问能否得到这个result,并返回次数或(-1)。
方法:
简单的bfs,用bfs模拟每次洗牌的过程,将每次过程的结果再判断。bfs的次数相当于洗牌次数,越来越深入。
AC代码:
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int c;
string result,mid; //mid为当前转换后的s12
map<string,int>maps; //maps用来记录到达当前mid的次数
string com(string s1,string s2) //将s1 s2 转化成s12
{
string s12;
for(int i=0;i<c;i++)
{
s12+=s2[i];
s12+=s1[i];
}
return s12;
}
int bfs() //简单bfs模板
{
queue<string>q;
q.push(mid);
maps[mid]=1;
string theFront,s11,s22;
while(!q.empty())
{
theFront=q.front();
q.pop();
if(theFront==result)
{
return maps[theFront];
}
s11=theFront.substr(0,c);
s22=theFront.substr(c,c);
mid=com(s11,s22);
if(maps[mid]>0) //注意要在计算出新的mid后再判断,该行判断后再改变次数
{
return -1;
}
q.push(mid);
maps[mid]=maps[theFront]+1;
}
return -1;
}
int main()
{
int cases;
cin>>cases;
for(int num=1;num<=cases;num++)
{
cin>>c;
string s1,s2;
cin>>s1>>s2;
cin>>result;
mid=com(s1,s2);
int ans=bfs();
cout<<num<<" "<<ans<<endl;
}
return 0;
}