问题描述
扑克牌排序:构造扑克牌数组,对扑克牌进行排序。排序原则如下:数字从小到大是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。
输入五张牌(表示黑桃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 }