SDU程设思维实践VJ_week2_EX-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张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。

Output
输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

分析
发牌参照正常四个人玩牌时的方式,一人er一张牌,一个er一个er来,风水er轮流转,今晚er进万财。
参照上北下南左西右东。
SDU程设思维实践VJ_week2_EX-C(打牌)
假设A在牌桌东面,且抽到A发牌,则之后发牌顺序为南、西、北、东(每一次循环中最后发自己的),输入的字符串就是每一张牌的花色及数值。读入完成后使用sort()按照先花色(C < D < S < H)再数字(2<…< 9 < T < J < Q < K < A)进行排序即可。字母可以映射为数字(如T=10)。

Sample Input
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#

Sample Output
SDU程设思维实践VJ_week2_EX-C(打牌)

下附完整代码(已通过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;
}
上一篇:P3078 [USACO13MAR]扑克牌型Poker Hands


下一篇:python中的循环语句,python中循环的语法