http://poj.org/problem?id=3087
这道题就是把2个字符串相间的插在一起,然后再把下面一半和上面一半插在一起,问在组合的情况中有无出现目标状态。用string和map即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<string>
using namespace std;
map<string,bool> ma;
string ans;
string a,b,c;
bool flag=0; int l;
void check()
{
string t;
t=ans;
//cout<<t<<endl;
for(int i=0;i<l*2;i++)
{
if(i%2==0)
{
ans[i]=t[l+i/2];
}
else {
ans[i]=t[i/2];
}
}
//cout<<ans<<endl;
if(ans==c)flag=1;
}
int main(){
int t;
int cs=1;
cin>>t;
while(t--)
{
flag=0;
ma.clear();
cin>>l;
cin>>a;
cin>>b;
cin>>c;
int j=0;
string lss="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
ans=lss.substr(0,l*2);
//cout<<lss.size()<<endl;
for(int i=0;i<l;i++)
{
ans[j]=b[i];
j++;
ans[j]=a[i];
j++;
}
if(ans==c)flag=1;
ma[ans]=1;
int js=1;
while(ans!=c)
{
check();
js++;
if(ma[ans]==1)break;
else ma[ans]=1;
}
cout<<cs++<<" ";
if(flag)cout<<js<<endl;
else cout<<"-1"<<endl;
}
return 0;
}