POJ3087 Shuffle’m Up(模拟)

January 19, 2016

题目链接

题意:洗扑克,两堆 S1, S2 各有 C 个扑克。先从 S2 最下面拿一张放在新的一堆的最下面,再拿 S1 的最下面一张往上放,以此类推最后形成 2*C 个扑克组成的堆。上 C 个是新的 S2,下 C 个是新的 S1。问多少次能匹配上给定的顺序。

思路:set 存储字符串,find 方法判断是否有重复的。如果有重复的意味着构成一个循环节,如果还没匹配上就再也匹配不上了。(注意输入的字符串最左面是底部)

#include<iostream>
#include<cmath>
#include<queue>
#include<cstring>
#include<string>
#include<set>
#include<cstdio>
#include<algorithm>
using namespace std;

int main(){
    //freopen("a.txt", "r", stdin);
    int N; cin >> N;
    for(int k = 1; k <= N; k++){
        int ans = 0, l;
        string s1, s2, s3;
        cin >> l >> s1 >> s2 >> s3;
        set<string> s;
        while(1){
            string s4;
            for(int i = 0; i < l; i++){
                s4 += s2[i];
                s4 += s1[i];
            }
            for(int i = 0; i < l; i++){
                s1[i] = s4[i];
                s2[i] = s4[i+l];
            }
            ans++;
            if(s4 == s3)    break;
            if(s.find(s4) == s.end())
                s.insert(s4);
            else{
                ans = -1;
                break;
            }
        }
        printf("%d %dn", k, ans);
    }
    return 0;
}

Profile picture

Written by Armin Li , a venture capitalist. [Weibo] [Subscribe]