您的位置:首页 > 其它

poj3087——Shuffle'm Up

2017-11-15 17:05 381 查看
题目大意:两叠扑克牌,每叠都可以有不同种颜色的扑克牌,问至少经过多少次洗牌能让最终的一叠扑克牌按照所给颜色排列

输入:case个数n(1<=n<=1000)

           每叠扑克牌的张数c(1<=c<=100)

           第一叠扑克牌的颜色排列(从底往上)

           第二叠扑克牌的颜色排列

           理想的最终扑克牌颜色排列

输出:最少洗牌次数/-1

分析:字符串模拟扑克牌颜色,这道题唯一的难点在于如何判断不能到达理想的顺序,方法就是如果洗牌后第一叠扑克牌又回到了原始的s1状态,此时还无解,则表明不能达到理想顺序

代码:转载自http://cavenkaka.iteye.com/blog/1225468

#include<iostream>  

using namespace std;  

int main()  

{  

    int n, c;  

    char s1[105], s2[105], s12[210], des[210];  

    cin >> n;  

    for(int t = 1; t <= n; t ++)  

    {  

        cin >> c >> s1 >> s2 >> des;  

        int ans = 0;  

        bool flag = false;  

        char str1[105];  

        strcpy(str1, s1);  // str1保存原始状态的s1。  

        while(!flag)  

        {  

            int i, k = 0;  

            for(i = 0; i < c; i ++)  

            {   // s1和s2按规则合成s12。  

                s12[k ++] = s2[i];  

                s12[k ++] = s1[i];  

            }  

            s12[k] = 0;   

            ans ++;  

            if(!strcmp(s12, des))  

            {   // 若s12与目标相同。  

                flag = true;  

                break;  
            }  

            for(i = 0, k = 0; k < c; k ++)  // 新的s1。  

                s1[i ++] = s12[k];  

            s1[i] = 0;  

            for(i = 0, k = c; k < 2 * c; k ++)  // 新的s2。  

                s2[i ++] = s12[k];  

            s2[i] = 0;  

            if(!strcmp(s1, str1))  // 等到s1经过x次变换后回到str1,则说明不可能到达目标情况了。  

                break;   

        }  

        if(flag) cout << t << ' ' << ans << endl;  

        else cout << t << " -1" << endl;  

    }  

    return 0;  

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