2020-03-06 C - 瑞神打牌

题意

有东南西北四个方向,首先指定在某个方向上的人开始发牌,然后从这个方向开始,按照东南西北的顺序,从发牌人的下一个人开始发牌,一人发一张轮流发牌,输入的数据是两串string类型的编码,每两个是一组,一组中第一个是这张牌的花色,第二个事这张牌的大小,要求计算出东南西北四个方向上的每个人的的所有牌,然后按照花色和牌的大小,双关键字排序。

思路

首先想到的是vector数组,,申请4个,代表四个方向的四个人,然后里面是pair类型变量,用这种变量来存储每个人的所有牌,用string来存储输入的两组牌面数据,然后发现,每一轮在这组数据中占8位,因为有4个人,每张牌有花色和大小,所以我设计一个for循环,里面的变量i每次加8位,每次一个循环中,就让每个人的vector读取数据中的两位,这样4个人的正确取牌获得,然后我用map,存储所有的牌面和花色的大小,编写一个双关键字比较函数,其中用map来把花色和牌面转成实际值来放进sort函数来进行排序,一开始的时候,我还是设置了另一个map,用来存储东南西北每个方向的下一个方向是什么,最后的时候要求从南方向开始输出,所以最后的时候,用这个map来把开始的时候每个方向上的人和相应的vector数组连接输出即可。

总结

这道题考察如何存储每个人的牌,还有把每个人和相应的方向相联系的操作,还有一个就是,在牌面和花色有部分是字母的情况下,如何进行排序的问题。

AC代码

#include
#include
#include
#include
#include
#include
using namespace std;
string simple, simple2;
vector > people[4];
map dot;
map Next;
map dui;
bool cmp(pair a, pair b)
{
    if (a.first != b.first)return dot[a.first] < dot[b.first];
    return dot[a.second] < dot[b.second];
}
void print(int k)
{
    cout << '+';
    for (int i = 0; i < 13; i++)
    {
        cout << "---+";
    }
    cout << endl;
    cout << "|";
    for (int i = 0; i < 13; i++)
    {
        cout << people[k][i].second<<" "<< people[k][i].second<<"|";
    }
    cout << endl;
    cout << "|";
    for (int i = 0; i < 13; i++)
    {
        cout << " " << people[k][i].first << " " << "|";
    }
    cout << endl;
    cout << "|";
    for (int i = 0; i < 13; i++)
    {
        cout << people[k][i].second << " " << people[k][i].second << "|";
    }
    cout << endl;
    cout << '+';
    for (int i = 0; i < 13; i++)
    {
        cout << "---+";
    }
    cout << endl;
}
int main()
{
    for (int i = 0; i < 4; i++)
    {
        people[i].resize(13);
    }
    Next['N'] = 'E';
    Next['E'] = 'S';
    Next['S'] = 'W';
    Next['W'] = 'N';
    dot['C'] = 0;
    dot['D'] = 1;
    dot['S'] = 2;
    dot['H'] = 3;
    dot['T'] = 10;
    dot['J'] = 11;
    dot['Q'] = 12;
    dot['K'] = 13;
    dot['A'] = 14;
    dot['2'] = 2;
    dot['3'] = 3;
    dot['4'] = 4;
    dot['5'] = 5;
    dot['6'] = 6;
    dot['7'] = 7;
    dot['8'] = 8;
    dot['9'] = 9;
    char begin;
    while (1)
    {
        cin >> begin;
        char then=begin;
        for (int i = 0; i < 4; i++)
        {
            then = Next[then];
            dui[then] = i;
        }
        if (begin == '#')
            break;
        cin >> simple >> simple2;
        simple = simple + simple2;
        int b = 0;
        for (int i = 0; i < 104; i +=8 )
        {
            people[0][b]=make_pair(simple[i], simple[i + 1]);
            people[1][b]=make_pair(simple[i+2], simple[i + 3]);
            people[2][b]=make_pair(simple[i + 4], simple[i + 5]);
            people[3][b]=make_pair(simple[i+6], simple[i + 7]);
            b++;
        }
        for (int i = 0; i < 4; i++)
        {
            sort(people[i].begin(), people[i].end(), cmp);
        }
        char th='S';
        for (int i = 0; i < 4; i++)
        {
            int k = dui[th];
            switch (th)
            {
                case    'S':
                    cout << "South player:" << endl;
                    break;
                case 'E':
                    cout << "East player:" << endl;
                    break;
                case 'W':
                    cout << "West player:" << endl;
                    break;
                case 'N':
                    cout << "North player:" << endl;
                    break;
            }
            print(k);
            th = Next[th];
        }
        cout << endl;
    }
}

你可能感兴趣的:(2020-03-06 C - 瑞神打牌)