小明手上有一副扑克牌,共?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在美国信息交换标准代码中已经有了顺序,所以直接排序就行了。
#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;
}