poj 3087 Shuffle'm Up

来源:互联网 发布:淘宝刷好评买家封号 编辑:程序博客网 时间:2024/04/26 20:41

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;}


原创粉丝点击