题意
- 四个人围成一圈打牌,有一个人发牌,从他的下一个人开始顺时针一人一张,每人能得到13张牌。
- 给定牌的大小顺序:
- 花色:C(梅花)<D(方片)<S(黑桃)<H(红桃)
- 面值:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
- 要求由小到大排序手中的牌,并按格式输出
输入样例(多组数据,#结束输入)
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#
输出样例
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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
思路
- 顺时针发牌:map转化发牌人方向为数组,使用模运算
- 牌的大小:利用map类型,转化为数字比较
- 对每个人sort排序,输出
总结
该题编译器版本较老,不支持c11,map初始化列表无法通过,if语句超时,改为在main中向map手动添加元素,顺利ac。
代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<char,int> dealPlayers;
map<char,int> colorOrder;
map<char,int> numberOrder;
struct poker {
char color;
char number;
poker() {}
poker(char c,char n):color(c),number(n) {}
};
bool cmp(const poker &a,const poker &b) {
if(a.color!=b.color)
return colorOrder[a.color]<colorOrder[b.color];
if(isalpha(a.number)&&isalpha(b.number))
return numberOrder[a.number]<numberOrder[b.number];
return a.number<b.number;
}
int main(void) {
dealPlayers['S']=0,dealPlayers['W']=1,dealPlayers['N']=2,dealPlayers['E']=3;
colorOrder['C']=0,colorOrder['D']=1,colorOrder['S']=2,colorOrder['H']=3;
numberOrder['T']=0,numberOrder['J']=1,numberOrder['Q']=2,numberOrder['K']=3,numberOrder['A']=4;
char dealCard;
while(1) {
cin>>dealCard;
if(dealCard=='#')
break;
int dealPlayer=dealPlayers[dealCard];
vector<poker> players_pokers[4];
char color,number;
for(int i=1; i<=52; ++i) {
cin>>color>>number;
players_pokers[(i+dealPlayer)%4].push_back(poker(color,number));
}
for(int i=0; i<4; ++i) {
sort(players_pokers[i].begin(),players_pokers[i].end(),cmp);
if(i==0)
printf("South player:\n");
else if(i==1)
printf("West player:\n");
else if(i==2)
printf("North player:\n");
else if(i==3)
printf("East player:\n");
printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
for(vector<poker>::iterator iter=players_pokers[i].begin(); iter!=players_pokers[i].end(); ++iter)
printf("|%c %c",iter->number,iter->number);
printf("|\n");
for(vector<poker>::iterator iter=players_pokers[i].begin(); iter!=players_pokers[i].end(); ++iter)
printf("| %c ",iter->color);
printf("|\n");
for(vector<poker>::iterator iter=players_pokers[i].begin(); iter!=players_pokers[i].end(); ++iter)
printf("|%c %c",iter->number,iter->number);
printf("|\n");
printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
}
printf("\n");
}
return 0;
}