枚举子集+恶心的模拟 /* coder: ACboy date: 2010-3-18 result: 1A description: UVa 131 The Psychic Poker Player */ #include <iostream> using namespace std; struct cards { int value; char a; char type; }; typedef int (*funs)(cards []); cards hand[5]; cards deck[5]; cards temp[5]; char BestHand[9][20] = { "straight-flush", "four-of-a-kind", "full-house", "flush", "straight", "three-of-a-kind", "two-pairs", "one-pair", "highest-card" }; int data[1100][10]; int c = 0; int cmp(const void * a, const void * b) { cards * pa = (cards *)a; cards * pb = (cards *)b; return pa->value > pb->value; } void print_subset(int n, int s) { for (int i = 0; i < n; i++) { if (s & (1 << i)) data[c][i] = 1; else data[c][i] = 0; } c++; } void findAll(int n) { for (int i = 0; i < (1 << n); ++i) { print_subset(n, i); } } int straight_flush(cards a[]) { char type = a[0].type; int ok = 1; for (int i = 1; i < 5; i++) { if (a[i].type != type) { ok = 0; break; } } if (ok == 0) return 0; int value = a[0].value; for (int j = 1; j < 4; ++j) { if (a[j].value == value + 1) { value = a[j].value; } else { ok = 0; break; } } if (ok == 0) return 0; if (value == 5 && a[4].value == 14) return 1; if (a[4].value == value + 1) return 1; } int four_of_a_kind(cards a[]) { int c = 0; int value = a[0].value; for (int i = 0; i < 5; ++i) { if (value == a[i].value) { c++; } else { value = a[i].value; c = 1; } } return c == 4; } int full_house(cards a[]) { int temp[5][1]; int c = 1; int value = a[0].value; int k = 0; for (int i = 0; i < 5; i++) { if (a[i].value == value) { k++; } else { temp[c][0] = k; c++; value = a[i].value; k = 1; } } return c == 2; } int flush(cards a[]) { char type = a[0].type; int ok = 1; for (int i = 0; i < 5; i++) { if (a[i].type != type) { ok = 0; break; } } return ok; }; int straight(cards a[]) { int value = a[0].value; int ok = 1; for (int i = 1; i < 4; i++) { if (a[i].value == value + 1) { value = a[i].value; } else { ok = 0; break; } } if (ok == 0) return 0; if ((value == 5 && a[4].value == 14) || a[4].value == value + 1) { return 1; } else { return 0; } } int three_of_a_kind(cards a[]) { int c = 1; int temp[5]; int value = a[0].value; int k = 0; for (int i = 0; i < 5; i++) { if (a[i].value == value) { k++; } else { temp[c] = k; c++; value = a[i].value; k = 1; } } if (c == 3) { int ok = 0; for (int j = 0; j < c; j++) { if (temp[j] == 3) { ok = 1; break; } } return ok; } return 0; } int two_pairs(cards a[]) { int c = 1; int value = a[0].value; int k = 0; for (int i = 0; i < 5; i++) { if (a[i].value == value) { k++; } else { c++; value = a[i].value; k = 1; } } return c == 3; } int one_pair(cards a[]) { int c = 1; int value = a[0].value; for (int i = 0; i < 5; i++) { if (value != a[i].value) { c++; value = a[i].value; } } return c == 4; } int main() { findAll(5); funs fun[8] = { straight_flush, four_of_a_kind, full_house, flush, straight, three_of_a_kind, two_pairs, one_pair, }; #ifndef ONLINE_JUDGE freopen("131.txt", "r", stdin); #endif char input[50]; while (gets(input)) { int i, j; int len = strlen(input); int k = 0; int t = 0; for (i = 0; i < len; i += 3) { int value; if (i < len / 2) { hand[k].a = input[i]; if (isalpha(input[i])) { switch (input[i]) { case 'T': value = 10; break; case 'J': value = 11; break; case 'Q': value = 12; break; case 'K': value = 13; break; case 'A': value = 14; break; } hand[k].value = value; } else { hand[k].value = input[i] - '0'; } hand[k].type = input[i + 1]; k++; } else { deck[t].a = input[i]; if (isalpha(input[i])) { switch (input[i]) { case 'T': value = 10; break; case 'J': value = 11; break; case 'Q': value = 12; break; case 'K': value = 13; break; case 'A': value = 14; break; } deck[t].value = value; } else { deck[t].value = input[i] - '0'; } deck[t].type = input[i + 1]; t++; } } int ans = 8; for (i = 0; i < c; i++) { int k = 0; for (j = 0; j < 5; j++) if (data[i][j]) { temp[k].value = hand[j].value; temp[k].a = hand[j].a; temp[k].type = hand[j].type; k++; } int t = 5 - k; for (j = 0; j < t; j++) { temp[k].value = deck[j].value; temp[k].a = deck[j].a; temp[k].type = deck[j].type; k++; } int tempAns= 8; qsort(temp, 5, sizeof(cards), cmp); for (j = 0; j < 8; j++) { if (fun[j](temp)) { tempAns = j; break; } } if (tempAns < ans) ans = tempAns; } cout << "Hand: "; for (j = 0; j < k; ++j) { cout << hand[j].a << hand[j].type << " "; } cout << "Deck: "; for (j = 0; j < t; ++j) { cout << deck[j].a << deck[j].type << " "; } cout << "Best hand: " << BestHand[ans] << endl; } return 0; }