POJ 3087 Shuffle'm Up

模拟。

就把洗牌的过程模拟一下,开一个$map$记录一下某状态是否出现过,如果之前出现过,就意味着无解。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}

int T,n;
char s1[400],s2[400],t[400],s[400];

int main()
{
    scanf("%d",&T); int cas=1;
    while(T--)
    {
        scanf("%d",&n);
        map<string,bool>f; memset(s,0,sizeof s); memset(t,0,sizeof t);
        scanf("%s%s",s1,s2); scanf("%s",s);
        int ans=0;
        while(1)
        {
            for(int i=0;i<n;i++) t[2*i]=s2[i], t[2*i+1]=s1[i];
            ans++;

            if(strcmp(s,t)==0) break;

            if(f[t]==0)
            {
                f[t]=1;
                for(int i=0;i<n;i++) s1[i]=t[i];
                for(int i=n;i<2*n;i++) s2[i-n]=t[i];
            }
            else {ans=-1; break;}
        }

        printf("%d %d\n",cas++,ans);
    }
    return 0;
}

 

posted @ 2016-08-25 16:58  Fighting_Heart  阅读(139)  评论(0编辑  收藏  举报