题目
瑞神HRZ因为疫情在家闲得无聊,同时他又非常厉害,所有的课对他来说都是水一水就能拿A+,所以他无聊,找来了另外三个人:咕咕东,腾神以及zjm来打牌(天下苦瑞神久矣)。
显然,牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是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的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
分析
发牌参照正常四个人玩牌时的方式,一人er一张牌,一个er一个er来,风水er轮流转,今晚er进万财。
参照上北下南左西右东。
假设A在牌桌东面,且抽到A发牌,则之后发牌顺序为南、西、北、东(每一次循环中最后发自己的),输入的字符串就是每一张牌的花色及数值。读入完成后使用sort()按照先花色(C < D < S < H)再数字(2<…< 9 < T < J < Q < K < A)进行排序即可。字母可以映射为数字(如T=10)。
Sample Input
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#
Sample Output
下附完整代码(已通过VJ测试;lang:C++)
#include<iostream>
#include<cstdlib>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;
struct Card
{
char cshape;
char cfigure;
int shape;//花色映射的数字
int figure;//面值映射的数字
Card(){ shape=-1;figure=-1; }
void setCard(char _cshape,int _shape,char _cfigure,int _figure)
{
cshape=_cshape;
cfigure=_cfigure;
shape=_shape;
figure=_figure;
}
bool operator<(const Card& other)
{
if(shape!=other.shape) return shape<other.shape;
if(figure!=other.figure) return figure<other.figure;
return false;
}
/* data */
};
void print(Card* p)
{
for(int i=0;i<13;i++){
printf("+---");
} printf("+\n");//1
for(int i=0;i<13;i++){
printf("|%c %c",p[i].cfigure,p[i].cfigure);
} printf("|\n");//2
for(int i=0;i<13;i++){
printf("| %c ",p[i].cshape);
} printf("|\n");//3
for(int i=0;i<13;i++){
printf("|%c %c",p[i].cfigure,p[i].cfigure);
} printf("|\n");//2
for(int i=0;i<13;i++){
printf("+---");
} printf("+\n");//1
}
int main()
{
//freopen("777.txt","r",stdin);
map<char,int> fmp;
for(char i='2',k=2;i<='9';i++){ fmp[i]=k++; }
fmp['T']=10; fmp['J']=11; fmp['Q']=12;
fmp['K']=13; fmp['A']=14;
fmp['N']=0; fmp['E']=1; fmp['S']=2; fmp['W']=3;
map<char,int> smp;
smp['C']=0; smp['D']=1; smp['S']=2; smp['H']=3;
Card* hands[4];//四个玩家,p0~1为各自的手牌
Card p0[13]; hands[0]=p0; //N
Card p1[13]; hands[1]=p1; //E
Card p2[13]; hands[2]=p2; //S
Card p3[13]; hands[3]=p3; //W
char guard;
while(true)
{
scanf("%c",&guard);
if(guard=='#') break;
int whose=fmp[guard]; char cards[106];
scanf("%s",cards); scanf("%s",cards+52); getchar();
for(int i=0;i<104;i++)
{
char cs=cards[i]; int is=smp[cs];
i++;
char cf=cards[i]; int iv=fmp[cf];
(hands[(++whose)%4])[i/8].setCard(cs,is,cf,iv);
}
//for(int i=0;i<4;i++) sort(hands[i],hands[i]+13);
sort(p2,p2+13); printf("South player:\n"); print(p2);
sort(p3,p3+13); printf("West player:\n"); print(p3);
sort(p0,p0+13); printf("North player:\n"); print(p0);
sort(p1,p1+13); printf("East player:\n"); print(p1);
cout<<endl;
}
//system("pause");
return 0;
}