蓝桥杯 12-2扑克排序 字符串操作

问题描述
  扑克牌排序:构造扑克牌数组,对扑克牌进行排序。排序原则如下:数字从小到大是2-10、J、Q、K和A,花色从小到大是方块(diamond)、梅花(club)、红桃(heart)、黑桃(spade)。两张牌比较时先看数字,数字相同时看花色。要求对输入的扑克牌进行从小到大排序。
  输入五张牌(表示黑桃2、红桃3、黑桃3、方块A和梅花J): 2 s 3 h 3 s A d J c
  输出结果应为:2 s 3 h 3 s J c A d数组长度固定为5。
样例输出
与上面的样例输入对应的输出。
例:
双关键字排序。
不过关键是这个输入是一行字符串,需要读入一行字符串,然后一点一点操作。
首先意识到一点:
除了数字10占了两位,其他都是一位字符表示数字,紧跟着一位字符表示花色。
然后把J当作11,Q12,K13,A14。
花色从小到大:方块d为1,梅花c为2,红桃h为3,黑桃s为4。
然后就可以做出来了。
细节还是很多的。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 struct node{ 
 4     char color; //花色d,c,h,s 
 5     int num; //对应的扑克牌数字用对应的实际数字表示,2~14 
 6     int c; //对应的花色用对应的数字表示,便于比较 1~4 
 7 } nd[5];
 8 int check(char t) { //花色转数字 
 9     switch (t) {
10         case 'd': return 1;
11         case 'c': return 2;
12         case 'h': return 3;
13         case 's': return 4;
14     }
15 } 
16 int judge(char c) { //A,J,Q,K转数字 
17     switch (c) {
18         case 'A': return 14;
19         case 'J': return 11;
20         case 'Q': return 12;
21         case 'K': return 13;
22     }
23 }
24 bool cmp(node n1, node n2) {
25     if (n1.num != n2.num) {
26         return n1.num < n2.num;
27     }
28     return n1.c < n2.c;
29 } 
30 int main() {
31     string s;
32     cin >> s;
33     int k = 0; 
34     for (int i = 0; i < s.length(); i += 2) {
35         if (s[i] == '1') { //数字为10的情况单独处理 
36             nd[k].num = 10;
37             nd[k].color = s[i + 2];
38             nd[k].c = check(nd[k].color); //把花色转为数字 
39             i++;
40             k++;
41         } else if (s[i] >= '2' && s[i] <= '9') {
42             nd[k].num = s[i] - '0';
43             nd[k].color = s[i + 1];
44             nd[k].c = check(nd[k].color); //把花色转为数字 
45             k++;
46         } else {
47             nd[k].num = judge(s[i]);
48             nd[k].color = s[i + 1];
49             nd[k].c = check(nd[k].color); //把花色转为数字 
50             k++;
51         }
52     }
53     sort(nd, nd + 5, cmp);
54     for (int i = 0; i < 5; i++) {
55         if (nd[i].num >= 11) {
56             switch (nd[i].num) {
57                 case 11: cout << 'J'; break;
58                 case 12: cout << 'Q'; break;
59                 case 13: cout << 'K'; break;
60                 case 14: cout << 'A'; break;
61             }
62         } else {
63             cout << nd[i].num;
64         }
65         cout << nd[i].color << " ";
66     }
67     return 0;
68 }
原文地址:https://www.cnblogs.com/fx1998/p/12718942.html