7-2 洗牌 (15 分)

作者: smatrcHendsa | 来源:发表于2019-03-06 21:44 被阅读0次

    小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌。虽然小弱T不怎么会洗牌,但是他却总是输。

    渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输。所以小弱T认为自己洗牌不够均匀,就独创了一种小弱洗牌法。

    小弱洗牌法是这样做的:

    先用传统洗牌法将52张扑克牌(1到K各四张,除去大小王)打乱,放成一堆,然后每次从牌堆顶层拿一张牌。

    如果这张牌的大小是 P(1到K的大小分别为1到13),那么就把这张牌插入到当前手中第P张牌的后面。

    如果当前手中不足P张牌,那么就把这张牌放在最后。

    现在给你一对已经被打乱的牌,请你用小弱洗牌法进行洗牌,然后输出最后生成的序列。

    注意:小弱可能在第一次洗牌时弄丢了某些牌,这时请你输出一个-1来提醒他牌的数目不够。

    输入格式:

    测试数据的输入含N个用空格隔开的字符串表示牌堆从顶至底的每张扑克(1到K中的某个)。可能有多行。

    输出格式:

    如果N为52,输出用小弱洗牌法洗牌后的序列,每个字符串用空格隔开。 否则请输出一个-1.

    输入样例:

    4 6 K Q 5 1 Q 9 7 9 K 3 J 1 2 3 5

    2

    3 5 7 Q 7 10 8 4 9 7 8 9 4

    10 6 2 8 2 10 10 Q 5 K J 1

    J 8 3 K 4 1 6 J 6

    输出样例:

    4 1 1 1 3 4 6 6 2 2 2 5 J 3 8 4 4 6 K J 8 J 10 10 K Q 2 5 7 8 10 9 3 7 9 8 7 1 10 5 6 3 Q K Q 5 Q 7 9 9 J K

    作者: 古强

    单位: 南昌大学

    时间限制: 400 ms

    内存限制: 64 MB

    原始写法 哈哈哈

    cin会把EOF也读进去 所以cnt为53

    强行判断10 他跟别的数字的区别是他是两个字符的

    ```

    #include <stdio.h>

    #include <iostream>

    #include <algorithm>

    #include <list>

    using namespace std;

    list <char> lis;

    list <char>:: iterator it = lis.begin();

    char arr[600];

    int cnt = 0;

    void show()

    {

        for (int i = 0; i < cnt; i++)

        {

            printf("%c ", arr[i]);

        }

        cout << endl;

    }

    int main()

    {

        while (!cin.eof())

        {

            cin >> arr[cnt];

            if (arr[cnt] == '0')

            {

                arr[cnt - 1] = 'A';

                continue;

            }

            cnt++;

        }

        if (cnt != 53)

        {

            printf("-1\n");

            return 0;

        }

        for(int i = 0; i < 52; i++)

        {

            int pos = arr[i] - '0';

            if (arr[i] == 'A')

                pos = 10;

            if (arr[i] == 'J')

                pos = 11;

            if (arr[i] == 'Q')

                pos = 12;

            if (arr[i] == 'K')

                pos = 13;

            if (lis.size() <= pos)

            {

                lis.push_back(arr[i]);

            }

            else

            {

                it = lis.begin();

                for (int j = 0; j < pos; j++)

                    it++;

                lis.insert(it, arr[i]);

            }

        }

        int j = 0;

        for(it = lis.begin(); it != lis.end(); it++)

        {

            if (*it != 'A')

                printf("%c", *it);

            else

                printf("10");

            if (j != 51)

                printf("%c",  ' ');

            else

                printf("\n");

            j++;

        }

        return 0;

    }

    ```

    学习了别人的代码 重写了 用getline vector string 这三个好方便 map的转换也好方便

    ```

    #include <stdio.h>

    #include <vector>

    #include <iostream>

    #include <string>

    #include <sstream>

    #include <map>

    using namespace std;

    string arr[60];

    map <string, int> mp;

    vector <string> v;

    int main()

    {

        int cnt = 0;

        mp["1"] = 1;

        mp["2"] = 2;

        mp["3"] = 3;

        mp["4"] = 4;

        mp["5"] = 5;

        mp["6"] = 6;

        mp["7"] = 7;

        mp["8"] = 8;

        mp["9"] = 9;

        mp["10"] = 10;

        mp["J"] = 11;

        mp["Q"] = 12;

        mp["K"] = 13;

        string str;

        while (getline(cin, str))

        {

            stringstream ssr(str);

            string s;

            while (ssr >> s)

            {

                if (s != "")

                    arr[cnt++] = s;

            }

        }

        if (cnt != 52)

        {

            printf("%d\n", -1);

            return 0;

        }

        for (int i = 0, t; i < cnt; i++)

        {

            t = mp[arr[i]];

            if (t >= v.size())

                v.push_back(arr[i]);

            else

            {

                vector <string>::iterator it = v.begin();

                for (int j = 0; j < t; j++, it++);

                v.insert(it, arr[i]);

            }

        }

        cout << v[0];

        for (int i = 1; i < cnt; i++)

        {

            cout << " " << v[i];

        }

        printf("\n");

        return 0;

    }

    ```

                

    相关文章

      网友评论

        本文标题:7-2 洗牌 (15 分)

        本文链接:https://www.haomeiwen.com/subject/darfpqtx.html