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