题目描述:
瑞神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张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。
Sample input:
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#
output:
输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
个人思路:
首先是一共52张牌,没张牌都有自己的花色,所以先用char ch[104]存进去。然后再用play[4][26]遍历出来就行。
当然,在这里面最重要的还是要理解我用的两个 map,正映射与反映射,正映射主要是用于排序,反映射用于输出。
剩下的一些就很简单了,代码逻辑也比较清晰。
贴代码:
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
char ch[105];
char play[4][26];
//正反向映射
map<char, int> b;
map<int, char>cb;
struct point {//x代表花色,y代表牌面
int x, y;
point() {};
point(const int& a, const int& b) {
x = a; y = b;
}
bool operator<(const point& p)const {
return x != p.x ? x < p.x : y < p.y;
}
};
point final[4][13];
void sort1() {
b['2'] = 2; cb[2] = '2';
b['3'] = 3; cb[3] = '3';
b['4'] = 4; cb[4] = '4';
b['5'] = 5; cb[5] = '5';
b['6'] = 6; cb[6] = '6';
b['7'] = 7; cb[7] = '7';
b['8'] = 8; cb[8] = '8';
b['9'] = 9; cb[9] = '9';
b['T'] = 10; cb[10] = 'T';
b['J'] = 11; cb[11] = 'J';
b['Q'] = 12; cb[12] = 'Q';
b['K'] = 13; cb[13] = 'K';
b['A'] = 14; cb[14] = 'A';
b['C'] = 15; cb[15] = 'C';
b['D'] = 16; cb[16] = 'D';
b['S'] = 17; cb[17] = 'S';
b['H'] = 18; cb[18] = 'H';
for (int i = 0; i < 13; ++i) {
final[0][i].x = b[play[0][2 * i]];
final[0][i].y = b[play[0][2 * i + 1]];
final[1][i].x = b[play[1][2 * i]];
final[1][i].y = b[play[1][2 * i + 1]];
final[2][i].x = b[play[2][2 * i]];
final[2][i].y = b[play[2][2 * i + 1]];
final[3][i].x = b[play[3][2 * i]];
final[3][i].y = b[play[3][2 * i + 1]];
}
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 13; ++j)
for (int k = 0; k < 12 - j; ++k) {
if (final[i][k] < final[i][k + 1]);
else
swap(final[i][k], final[i][k + 1]);
}
}
int main() {
char n;
map<int, char> d;
d[0] = 'S';
d[1] = 'W';
d[2] = 'N';
d[3] = 'E';
while (1) {
cin >> n;
if (n == '#')break;
for (int i = 0; i < 104; ++i)
cin >> ch[i];
int sign;
for (sign = 0; sign < 4; ++sign) {
if (d[sign] == n)break;
}
for (int p = sign, i = 0, j = 0; i < 13; ++i, j = i * 8) {
play[++p % 4][2 * i] = ch[j];
play[p % 4][2 * i + 1] = ch[++j];
play[++p % 4][2 * i] = ch[++j];
play[p % 4][2 * i + 1] = ch[++j];
play[++p % 4][2 * i] = ch[++j];
play[p % 4][2 * i + 1] = ch[++j];
play[++p % 4][2 * i] = ch[++j];
play[p % 4][2 * i + 1] = ch[++j];
}
sort1();
for (int i = 0; i < 4; ++i) {
if (i == 0)
cout << "South player:" << endl;
else if (i == 1)
cout << "West player:" << endl;
else if (i == 2)
cout << "North player:" << endl;
else
cout << "East player:" << endl;
cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
for (int j = 0; j < 13; ++j) {
cout << "|" << cb[final[i][j].y] << " " << cb[final[i][j].y];
}
cout << "|" << endl;
for (int k = 0; k < 13; ++k) {
cout << "| " << cb[final[i][k].x] << " ";
}
cout << "|" << endl;
for (int j = 0; j < 13; ++j) {
cout << "|" << cb[final[i][j].y] << " " << cb[final[i][j].y];
}
cout << "|" << endl;
cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+"<< endl;
}
cout << endl;
}
return 0;
}