poj 3087 Shuffle'm Up

来源:互联网 发布:app刷量软件 编辑:程序博客网 时间:2024/05/17 22:24


点击打开链接


题意:

两碓牌,数量均为c的s1,s2.  还有一堆目标排数量为c*2的s12。

问根据一定的洗牌规则,能否又s1,s2通过洗牌变成s12.

洗牌是交叉洗牌,s2先放。   合成一堆后,前半部分成为新的s1,后半部分新的s2.

题解:

直接模拟。出现重复情况直接GG 。

#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<map>#include<queue>#define LL long long#define ull unsigned long longusing namespace std;int main(){    int T,n,ca=1;    char s1[111],s2[111],s12[222],t[222];    cin>>T;    while(T--){        int ans=0,f=0;        map<string,int>ma;        cin>>n;        cin>>s1>>s2>>s12;        while(1){            int cnt=0;            ans++;            for(int i=0;i<n;++i){                t[cnt++]=s2[i];                t[cnt++]=s1[i];            }            t[cnt]='\0';            if(strcmp(t,s12)==0){                f=1;                break;            }            if(ma[t]==1) break;            ma[t]=1;            for(int i=0;i<n;i++){                s1[i]=t[i];                s2[i]=t[i+n];            }        }        if(f) printf("%d %d\n",ca,ans);        else printf("%d -1\n",ca);        ++ca;    }    return 0;}


0 0