0分求调(样例通过)
查看原帖
0分求调(样例通过)
378418
Chenaknoip楼主2024/7/9 17:05
#include <bits/stdc++.h>
using namespace std;
struct card {
	int c, n;
	/*
	c:
		0 -> S
		1 -> H
		2 -> D
		3 -> C
	n:
		A -> 14 / 1
		K -> 13
		Q -> 12
		J -> 11
		T -> 10
		9-2
	*/
};
bool operator == (card &x, card &y) {
	return x.c == y.c && x.n == y.n;
}
card me[2], en[2], pu[9]; // me, enemy, public(last 2 for users)
card a[5], b[5], c[5]; // compare a and b. a->me, b->enemy; c for the best choice
int s1, s2, s3; // judge kind of card
/*
9 -> huang jia tong hua shun
8 -> tong hua shun
7 -> si tiao
6 -> mam tang hong
5 -> tong hua
4 -> shun zi
3 -> san tiao
2 -> liang dui
1 -> yi dui
0 -> gao pai
*/
bool ok() {
	pu[5] = me[0], pu[6] = me[1];
	pu[7] = en[0], pu[8] = en[1];
	card t = {0, 0};
	for (int i = 0; i < 9; i++) {
		for (int j = i + 1; j < 9; j++) {
			if (pu[i] == pu[j]) {
				pu[5] = pu[6] = pu[7] = pu[8] = t;
				return 0;
			}
		}
	}
	return 1;
}
bool cmp(card &x, card &y) {
	return (x.n != y.n) ? (x.n > y.n) : (x.c < y.c);
}
bool cmpa() {
	/*
	return value:
	1 -> win
	0 -> lost / draw
	*/
	// diff kind
	if (s1 != s3) return s1 > s3;
	if (s1 == 9) return 0;
	if (s1 == 8) {
		return a[0].n > c[0].n;
	}
	if (s1 == 7) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 6) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 5) {
		for (int i = 0; i < 5; i++) {
			if (a[i].n != c[i].n) return a[i].n > c[i].n;
		}
		return 0;
	}
	if (s1 == 4) {
		return a[0].n > c[0].n;
	}
	if (s1 == 3) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		if (a[3].n != c[3].n) return a[3].n > c[3].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 2) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		if (a[3].n != c[3].n) return a[3].n > c[3].n;
		return a[4].n > c[4].n;
	}
	if (s1 == 1) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		for (int i = 2; i < 5; i++) {
			if (a[i].n != c[i].n) return a[i].n > c[i].n;
		}
		return 0;
	}
	for (int i = 0; i < 5; i++) {
		if (a[i].n != c[i].n) return a[i].n > c[i].n;
	}
	return 0; // default
}
bool cmpb() {
	/*
	return value:
	1 -> win
	0 -> lost / draw
	*/
	// diff kind
	if (s2 != s3) return s2 > s3;
	if (s2 == 9) return 0;
	if (s2 == 8) {
		return a[0].n > c[0].n;
	}
	if (s2 == 7) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		return a[4].n > c[4].n;
	}
	if (s2 == 6) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		return a[4].n > c[4].n;
	}
	if (s2 == 5) {
		for (int i = 0; i < 5; i++) {
			if (a[i].n != c[i].n) return a[i].n > c[i].n;
		}
		return 0;
	}
	if (s2 == 4) {
		return a[0].n > c[0].n;
	}
	if (s2 == 3) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		if (a[3].n != c[3].n) return a[3].n > c[3].n;
		return a[4].n > c[4].n;
	}
	if (s2 == 2) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		if (a[3].n != c[3].n) return a[3].n > c[3].n;
		return a[4].n > c[4].n;
	}
	if (s2 == 1) {
		if (a[0].n != c[0].n) return a[0].n > c[0].n;
		for (int i = 2; i < 5; i++) {
			if (a[i].n != c[i].n) return a[i].n > c[i].n;
		}
		return 0;
	}
	for (int i = 0; i < 5; i++) {
		if (a[i].n != c[i].n) return a[i].n > c[i].n;
	}
	return 0; // default
}
bool check() {
	/*
	return value:
	    1 -> win
		0 -> lost / draw
	*/
	// diff kind
	if (s1 != s2) return s1 > s2;
	if (s1 == 9) return 0;
	if (s1 == 8) {
		return a[0].n > b[0].n;
	}
	if (s1 == 7) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 6) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 5) {
		for (int i = 0; i < 5; i++) {
			if (a[i].n != b[i].n) return a[i].n > b[i].n;
		}
		return 0;
	}
	if (s1 == 4) {
		return a[0].n > b[0].n;
	}
	if (s1 == 3) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		if (a[3].n != b[3].n) return a[3].n > b[3].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 2) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		if (a[3].n != b[3].n) return a[3].n > b[3].n;
		return a[4].n > b[4].n;
	}
	if (s1 == 1) {
		if (a[0].n != b[0].n) return a[0].n > b[0].n;
		for (int i = 2; i < 5; i++) {
			if (a[i].n != b[i].n) return a[i].n > b[i].n;
		}
		return 0;
	}
	for (int i = 0; i < 5; i++) {
		if (a[i].n != b[i].n) return a[i].n > b[i].n;
	}
	return 0; // default
}
void judgec() {
	// (huang jia) tong hua shun
	if (c[0].c == c[1].c && c[1].c == c[2].c && c[2].c == c[3].c && c[3].c == c[4].c) {
		if (c[0].n == 14 && c[1].n == 13 && c[2].n == 12 && c[3].n == 11 && c[4].n == 10) { // AKQJT
			s3 = 9;
			return;
		}
		if (c[0].n == c[1].n + 1 && c[1].n == c[2].n + 1 && c[2].n == c[3].n + 1 && c[3].n == c[4].n + 1) { // shun zi
			s3 = 8;
			return;
		}
		if (c[0].n == 14 && c[1].n == 5 && c[2].n == 4 && c[3].n == 3 && c[4].n == 2) { // A2345
			swap(c[0], c[1]);
			swap(c[1], c[2]);
			swap(c[2], c[3]);
			swap(c[3], c[4]);
			s3 = 8;
			return;
		}
	}
	// 4 tiao
	if (c[0].n == c[1].n && c[1].n == c[2].n && c[2].n == c[3].n) {
		s3 = 7;
		return;
	}
	if (c[1].n == c[2].n && c[2].n == c[3].n && c[3].n == c[4].n) {
		s3 = 7;
		return;
	}
	// mam tang hong (3 dai 2))
	if (c[0].n == c[1].n && c[1].n == c[2].n && c[3].n == c[4].n) {
		s3 = 6;
		return;
	}
	if (c[0].n == c[1].n && c[2].n == c[3].n && c[3].n == c[4].n) {
		s3 = 6;
		// tiao zheng pai de shun xu
		c[0] = c[4];
		c[4] = c[3] = c[2] = c[1];
		c[1] = c[0];
		return;
	}
	// tong hua
	if (c[0].c == c[1].c && c[1].c == c[2].c && c[2].c == c[3].c && c[3].c == c[4].c) {
		s3 = 5;
		return;
	}
	// shun zi
	if (c[0].n == c[1].n + 1 && c[1].n == c[2].n + 1 && c[2].n == c[3].n + 1 && c[3].n == c[4].n + 1) { // shun zi
		s3 = 4;
		return;
	}
	if (c[0].n == 14 && c[1].n == 5 && c[2].n == 4 && c[3].n == 3 && c[4].n == 2) { // A2345
		s3 = 4;
		c[0].n = 1;
		return;
	}
	// 3 tiao
	if (c[0].n == c[1].n && c[1].n == c[2].n) {
		s3 = 3;
		return;
	}
	if (c[1].n == c[2].n && c[2].n == c[3].n) {
		s3 = 3;
		c[3] = c[0];
		c[0] == c[1];
		if (c[3].n < c[4].n) swap(c[3], c[4]);
		return;
	}
	if (c[2].n == c[3].n && c[3].n == c[4].n) {
		s3 = 3;
		c[4] = c[0];
		c[3] = c[1];
		c[0] = c[1] = c[2];
		if (c[3].n < c[4].n) swap(c[3], c[4]);
		return;
	}
	// 2 dui
	if (c[0].n == c[1].n) {
		if (c[2].n == c[3].n) {
			s3 = 2;
			if (c[0].n < c[2].n) {
				swap(c[0], c[2]);
				c[1] = c[0];
				c[3] = c[2];
			}
			return;
		}
		if (c[3].n == c[4].n) {
			s3 = 2;
			swap(c[4], c[2]);
			if (c[0].n < c[2].n) {
				swap(c[0], c[2]);
				c[1] = c[0];
				c[3] = c[2];
			}
			return;
		}
	}
	if (c[1].n == c[2].n) {
		if (c[3].n == c[4].n) {
			s3 = 2;
			swap(c[0], c[4]);
			swap(c[1], c[3]);
			if (c[0].n < c[2].n) {
				swap(c[0], c[2]);
				c[1] = c[0];
				c[3] = c[2];
			}
			return;
		}
	}
	// 1 dui
	if (c[0].n == c[1].n) {
		s3 = 1;
		return;
	}
	if (c[1].n == c[2].n) {
		s3 = 1;
		swap(c[2], c[0]);
		return;
	}
	if (c[2].n == c[3].n) {
		s3 = 1;
		swap(c[0], c[2]);
		swap(c[1], c[3]);
		return;
	}
	if (c[3].n == c[4].n) {
		s3 = 1;
		swap(c[0], c[3]);
		swap(c[1], c[4]);
		swap(c[2], c[3]);
		swap(c[3], c[4]);
		return;
	}
	// gao pai
	s3 = 0;
	return;
}
int main() {
	string s;
	while (cin >> s) {
		if (s == "#") break;
		{
		int num, cd;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		me[0] = {cd, num};
		cin >> s;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		me[1] = {cd, num};
		cin >> s;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		en[0] = {cd, num};
		cin >> s;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		en[1] = {cd, num};
		cin >> s;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		pu[0] = {cd, num};
		cin >> s;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		pu[1] = {cd, num};
		cin >> s;
		if (s[0] == 'S') cd = 0;
		if (s[0] == 'H') cd = 1;
		if (s[0] == 'D') cd = 2;
		if (s[0] == 'C') cd = 3;
		if (s[1] == 'A') num = 14;
		else if (s[1] == 'T') num = 10;
		else if (s[1] == 'J') num = 11;
		else if (s[1] == 'Q') num = 12;
		else if (s[1] == 'K') num = 13;
		else num = s[1] - '0';
		pu[2] = {cd, num};
		} // input
		int ans = 0, cnt = 0;
		for (int i = 0; i < 4; i++) {
			for (int j = 2; j <= 14; j++) {
				for (int k = 0; k < 4; k++) {
					for (int l = 2; l <= 14; l++) {
						pu[3] = {i, j};
						pu[4] = {k, l};
						if (!ok()) continue;
						memset(c, 0, sizeof(c));
						s3 = s1 = s2 = 0;
						// select card
						for (int m = 0; m < 7; m++) {
							for (int n = m + 1; n < 7; n++) {
								for (int o = n + 1; o < 7; o++) {
									for (int p = o + 1; p < 7; p++) {
										for (int q = p + 1; q < 7; q++) {
											pu[5] = me[0];
											pu[6] = me[1];
											c[0] = pu[m];
											c[1] = pu[n];
											c[2] = pu[o];
											c[3] = pu[p];
											c[4] = pu[q];
											sort(c, c + 5, cmp);
											judgec();
											if (!cmpa()) {
												for (int i = 0; i < 5; i++) a[i] = c[i];
												s1 = s3;
											}
											pu[5] = en[0];
											pu[6] = en[1];
											c[0] = pu[m];
											c[1] = pu[n];
											c[2] = pu[o];
											c[3] = pu[p];
											c[4] = pu[q];
											sort(c, c + 5, cmp);
											judgec();
											if (!cmpb()) {
												for (int i = 0; i < 5; i++) b[i] = c[i];
												s2 = s3;
											}
										}
									}
								}
							}
						}
						// cnt win
						ans += check();
						cnt++;
					}
				}
			}
		}
		double pwin = (double)ans / cnt;
		printf("%.20lf\n", pwin);
	}
	return 0;
}
2024/7/9 17:05
加载中...