POJ 3087 Shuffle'm Up 模拟,看着不像搜索啊

题意:给定s1,s1两副扑克,顺序从下到上。依次将s2,s1的扑克一张一张混合。例如s1,ABC; s2,DEF. 则第一次混合后为DAEBFC. 然后令前半段为s1, 后半段为s2. 如果可以变换成所给出的字符串,输出变换次数即可;否则,输出-1。

这题数据太水了,我是这样判断无法变换成题目所给出的字符串的:将每一次变换后的字符串存进数组,每次变换后由于之前变换后的字符串相比较,如果有相同的,就说明会无限循环下去。这样一来,循环次数会增加很多,然而0ms过了。。。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char ss[1000][200];
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    scanf("%d",&n);
    int t=1;
    while(n--)
    {
        int m;
        bool flag=false;
        char s1[200],s2[200],s[400];
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        memset(s,0,sizeof(s));
        memset(ss,0,sizeof(ss));
        scanf("%d%s%s%s",&m,s1,s2,s);
        for(int i=0;; i++)
        {
            for(int j=0; j<m; j++)
                ss[i][2*j]=s2[j];
            for(int j=0; j<m; j++)
                ss[i][2*j+1]=s1[j];
            if(strcmp(s,ss[i])==0)
            {
                printf("%d %d\n",t,i+1);
                break;
            }
            else
            {
                for(int j=0; j<i; j++)
                    if(strcmp(ss[i],ss[j])==0)
                    {
                        printf("%d -1\n",t);
                        flag=true;
                        break;
                    }
                if(flag)
                    break;
            }
            for(int j=0; j<m; j++)
            {
                s1[j]=ss[i][j];
                s2[j]=ss[i][j+m];
            }
        }
        t++;
    }
    return 0;
}

 

posted @ 2016-08-17 15:21  Pacify  阅读(621)  评论(0编辑  收藏  举报