您的位置:首页 > 其它

POJ 3087 Shuffle'm Up(模拟题)

2013-12-25 20:34 393 查看
Shuffle'm Up





大意:

已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去。现在输入s1和s2的初始状态
以及 预想的最终状态s12。问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1"




思路:就是个字符串模拟题。




#include <stdio.h>
#include <string.h>

void Solve()
{
    int n, m;
    char s1[110], s2[110], s3[210], s4[210], s[210];
    scanf("%d", &n);
    for(int p = 1; p <= n; p++)
    {
        memset(s, 'a', sizeof(s));
        scanf("%d%*c", &m);
        scanf("%s%s%s", s1, s2, s3);
        printf("%d ", p);
        strcpy(s, s1);
        strcat(s, s2);
        strcpy(s4, s);
        int t;
        for(t = 0; strcmp(s, s3); t++)
        {
            for(int j = 0; j < m; j++)
            {
                s1[j] = s[j];
                s2[j] = s[j+m];
            }
            int i, j;
            for(i = 0, j = 0; i < m; i++, j+=2)
            {
                s[j] = s2[i];
                s[j+1] = s1[i];
            }
            if(strcmp(s4, s) == 0)
            {
                t = -1;
                break;
            }
        }
        printf("%d\n", t);
    }
}

int main(void)
{
    //freopen("data.in", "r", stdin);
    Solve();

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: