天天关注:C语言算法---扑克牌排序问题描述

发布时间:   来源:CSDN  

文章目录


(资料图片仅供参考)

扑克牌排序问题描述 :输入说明 :输出说明 :输入范例 :输出范例 :解题思路参考代码

扑克牌排序

问题描述 :

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

在这个游戏中,一副牌的大小怪被除去,然后把剩下的 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 张牌;每张牌用两个字母表示,首字母表示花色,尾字母表示点数,两张牌之间有一个空格。每副牌与每副牌之间没有任何空行,第一副牌前面以及最后一副牌后面也都没有任何空行。 注:通常,键盘为标准输入设备。

输出说明 :

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

输入范例 :

2ST CQ S8 D8 HQ D2 H3 HK H9 H2 HT SK CKD9 HJ H7 DJ S2 SQ DT C2 H4 H5 DA D4 D5D6 S4 S9 S5 S7 SJ H8 D3 C8 S3 C4 S6 C9SA C7 HA H6 DK CJ D7 CA C5 CT DQ C6 C3D6 S4 S9 S5 S7 SJ H8 D3 C8 S3 C4 S6 C9D9 HJ H7 DJ S2 SQ DT C2 H4 H5 DA D4 D5ST CQ S8 D8 HQ D2 H3 HK H9 H2 HT SK CKSA C7 HA H6 DK CJ D7 CA C5 CT DQ C6 C3

输出范例 :

SK HK CK HQ CQ ST HT H9 S8 D8 H3 H2 D2DA SQ HJ DJ DT D9 H7 H5 D5 H4 D4 S2 C2SJ S9 C9 H8 C8 S7 S6 D6 S5 S4 C4 S3 D3SA HA CA DK DQ CJ CT D7 C7 H6 C6 C5 C3SJ S9 C9 H8 C8 S7 S6 D6 S5 S4 C4 S3 D3DA SQ HJ DJ DT D9 H7 H5 D5 H4 D4 S2 C2SK HK CK HQ CQ ST HT H9 S8 D8 H3 H2 D2SA HA CA DK DQ CJ CT D7 C7 H6 C6 C5 C3

解题思路

使用 C 语言的库函数 qsort,需要注意扑克牌的大小不完全是字典序

A > K > Q > J > 9 > 8 > …… > 2;

花色为字典序降序

黑桃(S),红心(H),方块(D),草花(C)。

参考代码

#include#include#include#include#include#include#define MAX_SIZE 13struct Poker{char color;  char num;};void input(struct Poker p[4][MAX_SIZE]);void output(struct Poker p[4][MAX_SIZE]);int cmp(const void *a, const void *b){struct Poker *c = (struct Poker *)a;  struct Poker *d = (struct Poker *)b;  if (c->num != d->num) //对牌号排序: A > K > Q > J    if ("A" <= c-="">num && c->num <= "Z" && "A" <= d-="">num && d->num <= if="" c-="">num == "Q" && d->num == "J" || c->num == "J" && d->num == "Q")        return d->num - c->num;      else if (c->num == "K" && d->num == "J" || c->num == "J" && d->num == "K")        return d->num - c->num;      else        return c->num - d->num;    else //字母排在数字后      return d->num - c->num;  else //数字相同,按颜色排序    return d->color - c->color;}int main(){int i, j, n;  struct Poker poker[4][MAX_SIZE];  scanf("%d", &n);  getchar();  for (i = 0; i < n; i++)  {input(poker);    for (j = 0; j < 4; j++)      qsort(poker[j], MAX_SIZE, sizeof(poker[j][0]), cmp);    output(poker);    if (n > 1)      putchar("\n");  }  return 0;}void input(struct Poker p[4][MAX_SIZE]){int i, j;  for (i = 0; i < 4; i++)  {for (j = 0; j < 13; j++)    {scanf("%c%c", &p[i][j].color, &p[i][j].num);      getchar();    }  }}void output(struct Poker p[4][MAX_SIZE]){int i, j;  for (i = 0; i < 4; i++)  {printf("%c%c", p[i][0].color, p[i][0].num);    for (j = 1; j < 13; j++)      printf(" %c%c", p[i][j].color, p[i][j].num);    putchar("\n");  }}

相关文章Related

返回栏目>>