东华大学2020考研计算机OJ题目解答分享——进阶篇(85)

85 扑克牌

作者: ZhouMingLiang 时间限制: 10S章节: 结构体

问题描述 :

明明和他的三位同学在玩一种非常有趣的扑克牌游戏。

在这个游戏中,一副牌的大小怪被除去,然后把剩下的52张牌随机发给4个人,这样每个人的手中就有13张牌。

接下来的任务就是每个人把自己手中的牌按一定的顺序整理好。理牌的顺序如下:

首先按牌的大小整理,牌的大小顺序为:A,K,Q,J,T(10),9,…,2,如果牌的大小相等,则按如下的花色顺序整理:黑桃(S),红心(H),方块(D),草花(C)。

例如有一个人手中拿到的牌如下:

ST CQ S8 D8 HQ D2 H3 HK H9 H2 HT SK CK

经过整理后的牌的顺序会变为:

SK HK CK HQ CQ ST HT H9 S8 D8 H3 H2 D2

其中SK、HK、CK这三张牌的大小相同,都是K,于是根据花色的顺序整理,先是S,再是H,最后是C,所以顺序为SK、HK、CK。

当每个人把自己手中的牌整理完后,他们就开始玩非常有趣的扑克游戏了。但是玩着玩着,他们发现了一个问题:理牌的时间太长,这使得他们玩牌的兴致被大大减弱了。于是他们来求助于你,能否帮他们写一个理牌程序,帮助他们理牌,这样他们就可以不必把大量的时间花在理牌上面,而尽情享受玩牌的乐趣了。

明明的问题可以归结为:给你每人手中顺序打乱的13张牌,一共有4套,然后通过题目中描述的理牌顺序,理好这4套牌。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,测试数据的第一行有一个整数n,表示有几副牌需要整理,接着每副牌分四行输入,每行13张牌;每张牌用两个字母表示,首字母表示花色,尾字母表示点数,两张牌之间有一个空格。每副牌与每副牌之间没有任何空行,第一副牌前面以及最后一副牌后面也都没有任何空行。 注:通常,键盘为标准输入设备。

输出说明 :

对于每一副牌,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。对于每组输入的牌,输出排序后的牌,分四行输出,输出样式与输入相同。每组运算结果与其后一组运算结果之间有一个空行,第一组运算结果前面及最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。

输入范例 :

2
ST CQ S8 D8 HQ D2 H3 HK H9 H2 HT SK CK
D9 HJ H7 DJ S2 SQ DT C2 H4 H5 DA D4 D5
D6 S4 S9 S5 S7 SJ H8 D3 C8 S3 C4 S6 C9
SA C7 HA H6 DK CJ D7 CA C5 CT DQ C6 C3
D6 S4 S9 S5 S7 SJ H8 D3 C8 S3 C4 S6 C9
D9 HJ H7 DJ S2 SQ DT C2 H4 H5 DA D4 D5
ST CQ S8 D8 HQ D2 H3 HK H9 H2 HT SK CK
SA C7 HA H6 DK CJ D7 CA C5 CT DQ C6 C3

输出范例 :

SK HK CK HQ CQ ST HT H9 S8 D8 H3 H2 D2
DA SQ HJ DJ DT D9 H7 H5 D5 H4 D4 S2 C2
SJ S9 C9 H8 C8 S7 S6 D6 S5 S4 C4 S3 D3
SA HA CA DK DQ CJ CT D7 C7 H6 C6 C5 C3

SJ S9 C9 H8 C8 S7 S6 D6 S5 S4 C4 S3 D3
DA SQ HJ DJ DT D9 H7 H5 D5 H4 D4 S2 C2
SK HK CK HQ CQ ST HT H9 S8 D8 H3 H2 D2
SA HA CA DK DQ CJ CT D7 C7 H6 C6 C5 C3

解答思路:

	这主要是在存储时就把字符处理成数字,然后排序即可,麻烦的是怎么把每行以空格
相隔的两组数据存入数组。

AC代码

#include 
#include 

char colo[5]={
     '0','C','D','H','S'};
char num[15]={
     '0','0','2','3','4','5','6','7','8','9','T','J','Q','K','A'} ;


struct Card{
     
	int color;     							//黑桃红心方块草花分别为4321 ; 
	int number;    							//T=10,J=11,Q=12,K=13,A=14; 
}; 

/**
*以颜色排序
*/
void sortcolor(Card a[])
{
     
	for(int i=0;i<12;i++)
	{
     
		for(int j=0;j<12-i;j++)
		{
     
			if(a[j].color<a[j+1].color)
			{
     
				int tempcolor=a[j].color,tempnum=a[j].number;
				a[j].color=a[j+1].color;
				a[j].number=a[j+1].number;
				a[j+1].color=tempcolor;
				a[j+1].number=tempnum;
			}
			
		}
	}
	
}

/**
*以数字排序
*/
void sortnum(Card a[])
{
     
	for(int i=0;i<12;i++)
	{
     
		for(int j=0;j<12-i;j++)
		{
     
			if(a[j].number<a[j+1].number)
			{
     
				int tempcolor=a[j].color,tempnum=a[j].number;
				a[j].color=a[j+1].color;
				a[j].number=a[j+1].number;
				a[j+1].color=tempcolor;
				a[j+1].number=tempnum;
			}
			
		}
	}
	
}

int main(){
     
	int n;
	scanf("%d",&n);
	getchar();
	n*=4;
	for(int i=1;i<=n;i++)					//以行为单位进行处理,2副牌即8行
	{
     
		char a[100];					
		gets(a);
		int r=0;
		Card card[13];
		/**
		*先看做一个字符串存入数组,然后按一个颜色一个大小一个空格的顺序,逐组存入。
		*/
		for(int i=0;i<strlen(a);i++)		
		{
     
			for(int k=0;k<5;k++)
			{
     
				if(a[i]==colo[k])
				{
     
					card[r].color=k;
				}
			}
			i++;
			for(int k=0;k<15;k++)
			{
     
				if(a[i]==num[k])
				{
     
					card[r].number=k;
				}
			}
			i++;
			r++;

		}
		
		sortcolor(card);
		sortnum(card);
		
		for(int i=0;i<13;i++)
		{
     
			printf("%c%c",colo[card[i].color],num[card[i].number]);
			if(i==12)
			{
     
				printf("\n");
			}
			else
			{
     
				printf(" ");
			}
		}
		
		
		if(i%4==0)
		{
     
			printf("\n");
		}
		
		
		
	}
	
}

你可能感兴趣的:(c++)