C题——瑞神打牌(接上)


题目描述:

瑞神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;
}




发布了13 篇原创文章 · 获赞 0 · 访问量 221

猜你喜欢

转载自blog.csdn.net/XianAnn/article/details/104630228
今日推荐