C-瑞神打牌

题意概述

瑞神和其余三人打牌,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2
< 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q
< K < A。

输入输出

Input

输入包含多组数据。
每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。

Output

输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行。
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

Sample Input

N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#

Sample Output

South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+

解题思路

1.由于每张牌都对应花色和数值,因此用结构体card表示,并重载比较操作符。然后再用一个结构体person记录每个人的牌面和牌数。
2.对于牌的顺序问题,用map将花色和数值分别与表示大小的数字对应起来,便于顺序的判断。
3.对于每组输入的52张牌,分别用card结构体的两个字符变量记录每一张牌面的字符和数值。
4.输出结果前,用sort函数对牌面进行排序,然后用for循环输出每个人牌面。

代码

#include
#include
#include
using namespace std;

map<char,int> mp1,mp2,mp3;
char player;//发牌员 
//牌面结构体
struct card{	
    char col,num;//花色,数值
    bool operator<(const card & c)const
    {
        if(col!=c.col) return mp1[col]<mp1[c.col];
        return mp2[num]<mp2[c.num]; 
     } 
};
//人结构体
struct person{
    card Card[13];//记录牌面
    int order;//记录每个人手里牌的顺序
}p[4];
//按照输出顺序用字符串记录,便于在for循环中输出
string name[4]={
    "South player:",
    "West player:",
    "North player:",
    "East player:"
};

int main()
{
    //用数字大小标志字符的顺序 
    mp1['C']=0;
    mp1['D']=1;
    mp1['S']=2;
    mp1['H']=3;
   //标志牌面数值的大小顺序 
    mp2['2']=0;
    mp2['3']=1;
    mp2['4']=2;
    mp2['5']=3;
    mp2['6']=4; 
    mp2['7']=5;
    mp2['8']=6;
    mp2['9']=7;
    mp2['T']=8;
    mp2['J']=9;
    mp2['Q']=10;
    mp2['K']=11;
    mp2['A']=12;
    //发牌员编号 
    mp3['S']=0;
    mp3['W']=1;
    mp3['N']=2;
    mp3['E']=3;
    card Card; 
    while(1)
    {
        cin>>player;
        if(player=='#')
            break;
        int pl=mp3[player];//pl记录发牌员编号
        for(int i=0;i<4;i++)
        {//初始化牌数编号
            p[i].order=0;
        }
        for(int i=0;i<52;i++)
        {
            pl=(pl+1)%4;
            cin>>Card.col>>Card.num;//输入花色和数值
            p[pl].Card[p[pl].order]=Card;//使用结构体,把人和牌对应起来
            p[pl].order++;   
        }
        for(int i=0;i<4;i++)
        {
            sort(p[i].Card,p[i].Card+13);
            cout<<name[i]<<endl;
            cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
            for(int j=0;j<13;j++)
               cout<<'|'<<p[i].Card[j].num<<" "<<p[i].Card[j].num;
            cout<<'|'<<endl;
            for(int j=0;j<13;j++)
                cout<<'|'<<" "<<p[i].Card[j].col<<" ";
            cout<<'|'<<endl;
            for(int j=0;j<13;j++)
                cout<<'|'<<p[i].Card[j].num<<" "<<p[i].Card[j].num;
            cout<<'|'<<endl;
            cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;  
        }
        cout<<endl;
    }
    return 0;
}

总结反思

1.map真的好用啊!!尤其是按照字符排序时可以对应到数值上。
2.读懂题目真的很关键!!本题说每组数据之后额外输出一个空行,我愣是每行多输出了一个空行,还对照样例觉得很对orz。其实是在while循环之后输出空行。
3.结构体的嵌套使用起来有时比较方便,但用的时候要理清关系,别被绕晕了。

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