扑克牌排序

发布时间:2024年01月23日

题目描述

小明手上有一副扑克牌,共?5252?张,共有?44?种花色,分别用 S、H、D、C 表示,每种花色有?1313?张牌,用数字?11?到?1313?表示。
在某种玩法中,对于单张牌而言,数字为?22?的牌最大,数字为?11?的次之,接下来从大到小依次为数字为?1313?的、数字为?1212?的......数字为?33?的牌最小。
如果牌面数字相同,花色为 S 的最大,接下来从大到小依次是花色为 H、D、C 的。
小明从这副扑克牌里抽出若干张,请你帮他排个序吧

【输入格式】

输入为?N+1?行:
第一行为一个整数?N,0<N≤52,为抽出的牌数;
接下来有?N?行,每行有一个字符和一个整数,分别代表牌的花色和牌面数字。
保证没有重复的牌。

【输出格式】

输出为?N?行,为按要求排序后的扑克牌。每行有一个字符和一个整数,分别代表牌的花色和牌面数字。

【输入输出样例】

输入

5
C 1
H 13
D 1
C 13
S 2

输出

S 2
D 1
C 1
H 13
C 13

思想

这是一道考察结构体的题目。结构体中有花色数字大小两个变量,但是数值为1或2的牌要进行特殊处理,可以先把1或2的牌加13,再去排序,最后遇见14或15时再减去13。

由于S,H,D,C在美国信息交换标准代码中已经有了顺序,所以直接排序就行了。

AC代码

#include <iostream>
#include <algorithm>
using namespace std;

struct Stu
{
	char c;
	int num;
}a[100005];

bool cmp (Stu x, Stu y)
{
	if (x.num != y.num)
	{
		return x.num > y.num;
	}
	return x.c > y.c;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i].c >> a[i].num;
		if (a[i].num == 1 || a[i].num == 2)
		{	
			a[i].num += 13;
		}
	}
	sort(a + 1, a + n + 1, cmp);
	for (int i = 1; i <= n; i++)
	{
		if (a[i].num == 14 || a[i].num == 15)
		{	
			a[i].num -= 13;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		cout << a[i].c << " " << a[i].num << endl;
	}

	return 0;
}

文章来源:https://blog.csdn.net/jp1464656/article/details/135760530
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。