题目描述
瑞神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的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
解题思路
本题的难点为如何处理牌、花色相对大小及发牌顺序。
用结构体储存当前牌的花色、大小 。
通过枚举来比较大小,但输入、输出时要相对应转换。
通过取余4判断当前位置的牌是谁的。
用4个数组分别储存每个人的牌。
完整代码
//用结构体储存当前牌的花色、大小
//知道每次具体输入的数目,即52个,所以用结构体数组,52个单元
//for循环,通过取余4判断当前位置的牌是谁的
//用4个数组分别储存每个人的牌
#include<iostream>
using namespace std;
enum amount{C,D,S,H,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,T,J,Q,K,A};
struct Card
{
amount color;
amount number;
};
void clarify(Card a[],Card b[],Card c[],Card d[],Card card[])
{
int a0=0;
int b0=0;
int c0=0;
int d0=0;
for(int i=0;i<52;i++)
{ if(i%4==0)
{a[a0].color=card[i].color;
a[a0].number=card[i].number;
a0++;}
if(i%4==1)
{b[b0].color=card[i].color;
b[b0].number=card[i].number;
b0++;}
if(i%4==2)
{c[c0].color=card[i].color;
c[c0].number=card[i].number;
c0++;}
if(i%4==3)
{d[d0].color=card[i].color;
d[d0].number=card[i].number;
d0++;}
}
}
void Output(Card a[])
{
for(int i=0;i<12;i++)//排序
for(int l=0;l<12;l++)
{ if(a[l].color>a[l+1].color)
{
amount co=a[l].color;
amount nu=a[l].number;
a[l].color=a[l+1].color;
a[l+1].color=co;
a[l].number=a[l+1].number;
a[l+1].number=nu;
}
else if(a[l].color==a[l+1].color)
if(a[l].number>a[l+1].number)
{amount co=a[l].color;
amount nu=a[l].number;
a[l].color=a[l+1].color;
a[l+1].color=co;
a[l].number=a[l+1].number;
a[l+1].number=nu;
}
}
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
cout<<"|";
for(int i=0;i<13;i++)
{
switch (a[i].number){
case T:
cout<<"T";
break;
case J:
cout<<"J";
break;
case Q:
cout<<"Q";
break;
case K:
cout<<"K";
break;
case A:
cout<<"A";
break;
case TWO:
cout<<"2";
break;
case THREE:
cout<<"3";
break;
case FOUR:
cout<<"4";
break;
case FIVE:
cout<<"5";
break;
case SIX:
cout<<"6";
break;
case SEVEN:
cout<<"7";
break;
case EIGHT:
cout<<"8";
break;
case NINE:
cout<<"9";
break;
}
cout<<" ";
switch (a[i].number){
case T:
cout<<"T";
break;
case J:
cout<<"J";
break;
case Q:
cout<<"Q";
break;
case K:
cout<<"K";
break;
case A:
cout<<"A";
break;
case TWO:
cout<<"2";
break;
case THREE:
cout<<"3";
break;
case FOUR:
cout<<"4";
break;
case FIVE:
cout<<"5";
break;
case SIX:
cout<<"6";
break;
case SEVEN:
cout<<"7";
break;
case EIGHT:
cout<<"8";
break;
case NINE:
cout<<"9";
break;
}cout<<"|";}
cout<<endl;
cout<<"| ";
for(int i=0;i<13;i++)
{
switch (a[i].color){
case 0:
cout<<"C";
break;
case 1:
cout<<"D";
break;
case 2:
cout<<"S";
break;
case 3:
cout<<"H";
break;
}
cout<<" | ";}
cout<<endl;
cout<<"|";
for(int i=0;i<13;i++)
{
switch (a[i].number){
case T:
cout<<"T";
break;
case J:
cout<<"J";
break;
case Q:
cout<<"Q";
break;
case K:
cout<<"K";
break;
case A:
cout<<"A";
break;
case TWO:
cout<<"2";
break;
case THREE:
cout<<"3";
break;
case FOUR:
cout<<"4";
break;
case FIVE:
cout<<"5";
break;
case SIX:
cout<<"6";
break;
case SEVEN:
cout<<"7";
break;
case EIGHT:
cout<<"8";
break;
case NINE:
cout<<"9";
break;
}
cout<<" ";
switch (a[i].number){
case T:
cout<<"T";
break;
case J:
cout<<"J";
break;
case Q:
cout<<"Q";
break;
case K:
cout<<"K";
break;
case A:
cout<<"A";
break;
case TWO:
cout<<"2";
break;
case THREE:
cout<<"3";
break;
case FOUR:
cout<<"4";
break;
case FIVE:
cout<<"5";
break;
case SIX:
cout<<"6";
break;
case SEVEN:
cout<<"7";
break;
case EIGHT:
cout<<"8";
break;
case NINE:
cout<<"9";
break;
}cout<<"|";}
cout<<endl;
cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
}
int main(){
char dealer;//发牌员
Card c[52];
Card n[13];
Card e[13];
Card s[13];
Card w[13];
while(1)
{ cin>>dealer;
if(dealer=='#')
break;
for(int i=0;i<52;i++)
{char col;
char num;
cin>>col>>num;
switch (col){
case 'C':
c[i].color=C;
break;
case 'D':
c[i].color=D;
break;
case 'S':
c[i].color=S;
break;
case 'H':
c[i].color=H;
break;
}
switch (num){
case 'T':
c[i].number=T;
break;
case 'J':
c[i].number=J;
break;
case 'Q':
c[i].number=Q;
break;
case 'K':
c[i].number=K;
break;
case 'A':
c[i].number=A;
break;
case '2':
c[i].number=TWO;
break;
case '3':
c[i].number=THREE;
break;
case '4':
c[i].number=FOUR;
break;
case '5':
c[i].number=FIVE;
break;
case '6':
c[i].number=SIX;
break;
case '7':
c[i].number=SEVEN;
break;
case '8':
c[i].number=EIGHT;
break;
case '9':
c[i].number=NINE;
break;
}}
if(dealer=='N')
clarify(e,s,w,n,c);
else if(dealer=='E')
clarify(s,w,n,e,c);
else if(dealer=='S')
clarify(w,n,e,s,c);
else if(dealer=='W')
clarify(n,e,s,w,c);
cout<<"South player:"<<endl;Output(s);
cout<<"West player:"<<endl;Output(w);
cout<<"North player:"<<endl;Output(n);
cout<<"East player:"<<endl;Output(e);
cout<<endl;
}
}