B - 东东学打牌

题意介绍

给出每个人的一手牌,输出排名。

题意分析

首先要根据者一手牌得到这手牌对应的标号,标号相同的归为一类,然后写了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;
}
发布了40 篇原创文章 · 获赞 0 · 访问量 1051

猜你喜欢

转载自blog.csdn.net/weixin_44934885/article/details/105669203
B
a^b