题意介绍
给出每个人的一手牌,输出排名。
题意分析
首先要根据者一手牌得到这手牌对应的标号,标号相同的归为一类,然后写了8个比较函数用于对每一类中的每一手牌进行排序。排序完输出即可。
通过代码
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
using namespace std;
struct p {
string name;
int *a;
p(string n,int *aa){
name = n;
a = aa;
}
};
int sum(int *a,int s) {
int ans = 0;
for (int i = 0; i < s; i++)
ans += a[i];
return ans;
}
//同是大牌时,比较大小
bool cmp1(p p1, p p2) {
if(sum(p1.a, 5) != sum(p2.a, 5)) return sum(p1.a, 5) > sum(p2.a, 5);
else return p1.name < p2.name;
}
//同是对子时,比较大小
bool cmp2(p p1, p p2) {
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if (p1.a[i] == p1.a[i + 1] && p2.a[j] == p2.a[j + 1]) {
if (p1.a[i] != p2.a[j]) return p1.a[i] > p2.a[j];
else {
int sum1 = sum(p1.a, 5) - p1.a[i] - p1.a[i + 1];
int sum2 = sum(p2.a, 5) - p2.a[j] - p2.a[j + 1];
if(sum1!=sum2) return sum1 > sum2;
else return p1.name < p2.name;
}
}
}
//同是俩对,比较大小
bool cmp3(p p1, p p2) {
for (int i = 0; i < 2; i++) {
if (p1.a[i] == p1.a[i + 1]) {
for (int j = i + 2; j < 4; j++) {
if (p1.a[j] == p1.a[j + 1]) {
for (int k = 0; k < 2; k++) {
if (p2.a[k] == p2.a[k + 1]) {
for (int l = k + 2; l < 4; l++) {
if (p2.a[l] == p2.a[l + 1]) {
if (max(p1.a[i], p1.a[j]) != max(p2.a[k], p2.a[l])) return max(p1.a[i], p1.a[j]) > max(p2.a[k], p2.a[l]);
else {
if (min(p1.a[i], p1.a[j]) != min(p2.a[k], p2.a[l])) return min(p1.a[i], p1.a[j]) > min(p2.a[k], p2.a[l]);
else {
int sum1 = sum(p1.a, 5) - p1.a[i] * 2 - p1.a[j] * 2;
int sum2 = sum(p2.a, 5) - p2.a[k] * 2 - p2.a[l] * 2;
if(sum1!=sum2) return sum1 > sum2;
else return p1.name < p2.name;
}
}
}
}
}
}
}
}
}
}
}
//同是三个,比较大小
bool cmp4(p p1, p p2) {
for (int i = 0; i < 3; i++) {
if (p1.a[i] == p1.a[i + 1] && p1.a[i + 1] == p1.a[i + 2]) {
for (int j = 0; j < 3; j++) {
if (p2.a[j] == p2.a[j + 1] && p2.a[j + 1] == p2.a[j + 2]) {
if (p1.a[i] != p2.a[j]) return p1.a[i] > p2.a[j];
else {
int sum1 = sum(p1.a, 5) - p1.a[i] * 3;
int sum2 = sum(p2.a, 5) - p2.a[j] * 3;
if(sum1!=sum2) return sum1 > sum2;
else return p1.name < p2.name;
}
}
}
}
}
}
//同是三带二,比较大小,和 三个 相同
bool cmp5(p p1, p p2) {
for (int i = 0; i < 3; i++) {
if (p1.a[i] == p1.a[i + 1] && p1.a[i + 1] == p1.a[i + 2]) {
for (int j = 0; j < 3; j++) {
if (p2.a[j] == p2.a[j + 1] && p2.a[j + 1] == p2.a[j + 2]) {
if (p1.a[i] != p2.a[j]) return p1.a[i] > p2.a[j];
else {
int sum1 = sum(p1.a, 5) - p1.a[i] * 3;
int sum2 = sum(p2.a, 5) - p2.a[j] * 3;
if(sum1!=sum2) return sum1 > sum2;
else return p1.name < p2.name;
}
}
}
}
}
}
//同是炸弹,比较大小
bool cmp6(p p1, p p2) {
if (p1.a[0] == p1.a[1] && p2.a[0] == p2.a[1]) {
if (p1.a[0] != p2.a[0]) return p1.a[0] > p2.a[0];
else if(p1.a[4] != p2.a[4]) return p1.a[4] > p2.a[4];
else return p1.name < p2.name;
}
else if (p1.a[0] == p1.a[1] && p2.a[3] == p2.a[4]) {
if (p1.a[0] != p2.a[4]) return p1.a[0] > p2.a[4];
else if(p1.a[4] != p2.a[0]) return p1.a[4] > p2.a[0];
else return p1.name < p2.name;
}
else if (p1.a[3] == p1.a[4] && p2.a[0] == p2.a[1]) {
if (p1.a[4] != p2.a[0]) return p1.a[4] > p2.a[0];
else if(p1.a[0] != p2.a[4]) return p1.a[0] > p2.a[4];
else return p1.name < p2.name;
}
else {
if (p1.a[4] != p2.a[4]) return p1.a[4] > p2.a[4];
else if(p1.a[0] != p2.a[0]) return p1.a[0] > p2.a[0];
else return p1.name < p2.name;
}
}
//同是顺子,比较大小
bool cmp7(p p1, p p2) {
if (p1.a[4] != p2.a[4]) return p1.a[4] > p2.a[4];
else return p1.name < p2.name;
}
//同是龙顺,比较大小
bool cmp8(p p1, p p2) {
return p1.name < p2.name;
}
void change(int *a,string poker) {
int count = 0;
for (int i = 0; i < poker.size(); i++) {
if (poker[i] == 'A') a[count++] = 1;
else if (poker[i] == 'J') a[count++] = 11;
else if (poker[i] == 'Q') a[count++] = 12;
else if (poker[i] == 'K') a[count++] = 13;
else if (poker[i] == '1') { a[count++] = 10; i++; }
else a[count++] = poker[i] - '0';
}
sort(a, a + 5);
}
int type(int *a) {
if ((a[0] == a[1] && a[1] == a[2] && a[2] == a[3]) || (a[1] == a[2] && a[2] == a[3] && a[3] == a[4]))return 6;//炸弹
if ((a[0] == a[1] && a[1] == a[2] && a[3] == a[4]) || (a[0] == a[1] && a[2] == a[3] && a[3] == a[4])) return 5;//三带二
if ((a[0] == a[1] && a[1] == a[2]) || (a[1] == a[2] && a[2] == a[3]) || (a[2] == a[3] && a[3] == a[4])) return 4;//三个
if ((a[0] == a[1] && a[2] == a[3]) || (a[0] == a[1] && a[3] == a[4]) || (a[1] == a[2] && a[3] == a[4])) return 3;//俩对
if (a[0] == a[1] || a[1] == a[2] || a[2] == a[3] || a[3] == a[4]) return 2;//对子
if (a[0] + 1 == a[1] && a[1] + 1 == a[2] && a[2] + 1 == a[3] && a[3] + 1 == a[4]) return 7;//顺子
if (a[0] == 1 && a[1] == 10 && a[2] == 11 && a[3] == 12 && a[4] == 13) return 8;//龙顺子
else return 1;//大牌
}
int n;
map<int, vector<p> > ran;
string name, poker;
void output() {
if (ran[8].size()>0) {
sort(ran[8].begin(), ran[8].end(), cmp8);
for (int i = 0; i < ran[8].size(); i++)
cout << ran[8][i].name << endl;
}
if (ran[7].size()>0) {
sort(ran[7].begin(), ran[7].end(), cmp7);
for (int i = 0; i < ran[7].size(); i++)
cout << ran[7][i].name << endl;
}
if (ran[6].size()>0) {
sort(ran[6].begin(), ran[6].end(), cmp6);
for (int i = 0; i < ran[6].size(); i++)
cout << ran[6][i].name << endl;
}
if (ran[5].size()>0) {
sort(ran[5].begin(), ran[5].end(), cmp5);
for (int i = 0; i < ran[5].size(); i++)
cout << ran[5][i].name << endl;
}
if (ran[4].size()>0) {
sort(ran[4].begin(), ran[4].end(), cmp4);
for (int i = 0; i < ran[4].size(); i++)
cout << ran[4][i].name << endl;
}
if (ran[3].size()>0) {
sort(ran[3].begin(), ran[3].end(), cmp3);
for (int i = 0; i < ran[3].size(); i++)
cout << ran[3][i].name << endl;
}
if (ran[2].size()>0) {
sort(ran[2].begin(), ran[2].end(), cmp2);
for (int i = 0; i < ran[2].size(); i++)
cout << ran[2][i].name << endl;
}
if (ran[1].size()>0) {
sort(ran[1].begin(), ran[1].end(), cmp1);
for (int i = 0; i < ran[1].size(); i++)
cout << ran[1][i].name << endl;
}
}
int main() {
while (cin >> n) {
ran.clear();
while (n--) {
cin >> name >> poker;
int *a = new int[6];
change(a,poker);
p tmp(name, a);
int num = type(a);
ran[num].push_back(tmp);
}
output();
}
return 0;
}