题意:有点像德州扑克……什么同花,顺子,对牌,高牌什么的……问两方谁赢,或者是平手。
大大大大大模拟……慢慢写……写了好久
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
// 1.High Card
// 2.Pair
// 3.Two Pairs
// 4.Three of a Kind
// 5.Straight
// 6.Flush
// 7.Full House
// 8.Four of a kind
// 9.Straight flush
struct Node
{
char v;
char s;
};
struct Person
{
Node node[7];
int level;
int judge_value;
int judge_value_2;
int judge_value_3;
int judge_value_4;
int judge_value_5;
};
Person black, white;
char input[30];
bool cmp(Node a, Node b)
{
return a.v < b.v;
}
bool cmp2(Node a, Node b)
{
return a.v > b.v;
}
int getsamev(Person tt) // how many same value or suit
{
int cnt[150];
memset(cnt, 0, sizeof(cnt));
// 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A
for (int i = 1; i <= 5; i++) cnt[tt.node[i].v]++;
int ans = 1;
for (int i = 0; i < 150; i++) ans = max(ans, cnt[i]);
return ans;
}
int getsames(Person tt)
{
int cnt[10];
memset(cnt, 0, sizeof(cnt));
// 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A
for (int i = 1; i <= 5; i++) cnt[tt.node[i].s]++;
int ans = 1;
for (int i = 0; i < 10; i++) ans = max(ans, cnt[i]);
return ans;
}
bool isconv(Person tt, int start, int end) // judge if tt[start] to tt[end] is consecutive
{
for (int i = end; i >= start + 1; i--)
{
if (tt.node[i].v - tt.node[i - 1].v != 1)
return false;
}
return true;
}
void change(char &a)
{
if (a == 'T') a = '9' + 1;
else if (a == 'J') a = '9' + 2;
else if (a == 'Q') a = '9' + 3;
else if (a == 'K') a = '9' + 4;
else if (a == 'A') a = '9' + 5;
else if (a == 'C') a = 1;
else if (a == 'D') a = 2;
else if (a == 'H') a = 3;
else if (a == 'S') a = 4;
}
void getlevel(Person &tt)
{
// 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A
for (int i = 1; i <= 5; i++) change(tt.node[i].v), change(tt.node[i].s);
sort(tt.node + 1, tt.node + 6, cmp);
int same_suit_num = getsames(tt); // number of same suit is same_suit_num
int same_value_num = getsamev(tt); // number of same value is same_value_num
tt.judge_value = tt.judge_value_2 = tt.judge_value_3 = tt.judge_value_4 = 0;
// 9.Straight flush
// 5 cards of the same suit with consecutive values.
// Ranked by the highest card in the hand.
if (same_suit_num == 5)
{
if (isconv(tt, 1, 5))
{
tt.judge_value = tt.node[5].v; // the highest card in the hand
tt.level = 9;
return;
}
}
// 8.Four of a kind
// 4 cards with the same value.
// Ranked by the value of the 4 cards.
if (same_value_num == 4)
{
if (tt.node[1].v == tt.node[2].v) tt.judge_value = tt.node[1].v;
else if (tt.node[2].v == tt.node[3].v) tt.judge_value = tt.node[2].v;
else if (tt.node[3].v == tt.node[4].v) tt.judge_value = tt.node[3].v;
tt.level = 8;
return;
}
// 7.Full House
// 3 cards of the same value, with the remaining 2 cards forming a pair.
// Ranked by the value of the 3 cards.
if (same_value_num == 3)
{
char tmp = '-';
char tmp2 = '-';
int cnt[150];
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= 5; i++) cnt[tt.node[i].v]++;
for (int i = 0; i < 150; i++)
{
if (cnt[i] == 3) tmp = (char)i;
else if (cnt[i] == 2) tmp2 = (char)i;
}
if (tmp != '-' && tmp2 != '-')
{
tt.level = 7;
tt.judge_value = tmp;
return;
}
}
// 6.Flush
// Hand contains 5 cards of the same suit.
// Hands which are both flushes are ranked using the rules for High Card.
if (same_suit_num == 5)
{
tt.judge_value = tt.node[5].v;
tt.judge_value_2 = tt.node[4].v;
tt.judge_value_3 = tt.node[3].v;
tt.judge_value_4 = tt.node[2].v;
tt.judge_value_5 = tt.node[1].v;
tt.level = 6;
return;
}
// 5.Straight
// Hand contains 5 cards with consecutive values.
// Hands which both contain a straight are ranked by their highest card.
if (isconv(tt, 1, 5))
{
tt.level = 5;
tt.judge_value = tt.node[5].v;
return;
}
// 4.Three of a Kind
// Three of the cards in the hand have the same value.
// Hands which both contain three of a kind are ranked by the value of the 3 cards.
if (same_value_num == 3)
{
tt.level = 4;
int cnt[150];
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= 5; i++) cnt[tt.node[i].v]++;
for (int i = 0; i < 150; i++)
{
if (cnt[i] == 3)
{
tt.judge_value = i;
break;
}
}
return;
}
// 3.Two Pairs
// The hand contains 2 different pairs.
// Hands which both contain 2 pairs are ranked by the value of their highest
// pair.
// Hands with the same highest pair are ranked by the value of their other pair.
// If these values are the same the hands are ranked by the value of the remaining card.
if (same_value_num == 2)
{
int cnt[150];
memset(cnt, 0, sizeof(cnt));
char tmp = '-';
char tmp2 = '-';
char tmp3 = '-';
for (int i = 1; i <= 5; i++) cnt[tt.node[i].v]++;
for (int i = 0; i < 150; i++)
{
if (cnt[i] == 2)
{
if (tmp == '-') tmp = i;
else tmp2 = i;
}
if (cnt[i] == 1)
tmp3 = i;
}
if (tmp != '-' && tmp2 != '-' && tmp3 != '-')
{
tt.judge_value = tmp > tmp2 ? tmp : tmp2;
tt.judge_value_2 = tmp < tmp2 ? tmp : tmp2;
tt.judge_value_3 = tmp3;
tt.level = 3;
return;
}
}
// 2.Pair
// 2 of the 5 cards in the hand have the same value.
// Hands which both contain a pair are ranked by the value of the cards forming the pair.
// If these values are the same, the hands are ranked by the values of the cards not forming the pair, in decreasing order.
if (same_value_num == 2)
{
int cnt[150];
memset(cnt, 0, sizeof(cnt));
char tmp[5];
int tot = 0;
for (int i = 1; i <= 5; i++) cnt[tt.node[i].v]++;
for (int i = 0; i < 150; i++)
{
if (cnt[i] == 2)
tt.judge_value = i;
else if (cnt[i] == 1)
tmp[tot++] = i;
}
tt.judge_value_2 = tmp[2];
tt.judge_value_3 = tmp[1];
tt.judge_value_4 = tmp[0];
tt.level = 2;
return;
}
tt.level = 1;
tt.judge_value = tt.node[5].v;
tt.judge_value_2 = tt.node[4].v;
tt.judge_value_3 = tt.node[3].v;
tt.judge_value_4 = tt.node[2].v;
tt.judge_value_5 = tt.node[1].v;
return;
}
int main()
{
while (gets(input))
{
for (int i = 1; i <= 5; i++)
{
black.node[i].v = input[(i - 1) * 3];
black.node[i].s = input[(i - 1) * 3 + 1];
white.node[i].v = input[(i + 4) * 3];
white.node[i].s = input[(i + 4) * 3 + 1];
}
getlevel(black);
getlevel(white);
if (black.level > white.level) printf("Black wins.\n");
else if (black.level < white.level) printf("White wins.\n");
else
{
if (black.level == 2)
{
if (black.judge_value != white.judge_value)
{
if (black.judge_value > white.judge_value) printf("Black wins.\n");
if (black.judge_value < white.judge_value) printf("White wins.\n");
}
else
{
if (black.judge_value_2 != white.judge_value_2)
{
if (black.judge_value_2 > white.judge_value_2) printf("Black wins.\n");
if (black.judge_value_2 < white.judge_value_2) printf("White wins.\n");
}
else
{
if (black.judge_value_3 != white.judge_value_3)
{
if (black.judge_value_3 > white.judge_value_3) printf("Black wins.\n");
if (black.judge_value_3 < white.judge_value_3) printf("White wins.\n");
}
else
{
// compare 4
if (black.judge_value_4 > white.judge_value_4) printf("Black wins.\n");
if (black.judge_value_4 < white.judge_value_4) printf("White wins.\n");
if (black.judge_value_4 == white.judge_value_4) printf("Tie.\n");
}
}
}
}
else if (black.level == 3)
{
if (black.judge_value != white.judge_value)
{
if (black.judge_value > white.judge_value) printf("Black wins.\n");
if (black.judge_value < white.judge_value) printf("White wins.\n");
}
else
{
if (black.judge_value_2 != white.judge_value_2)
{
if (black.judge_value_2 > white.judge_value_2) printf("Black wins.\n");
if (black.judge_value_2 < white.judge_value_2) printf("White wins.\n");
}
else
{
if (black.judge_value_3 > white.judge_value_3) printf("Black wins.\n");
if (black.judge_value_3 < white.judge_value_3) printf("White wins.\n");
if (black.judge_value_3 == white.judge_value_3) printf("Tie.\n");
}
}
}
else if (black.level == 1 || black.level == 6)
{
if (black.judge_value != white.judge_value)
{
if (black.judge_value > white.judge_value) printf("Black wins.\n");
if (black.judge_value < white.judge_value) printf("White wins.\n");
}
else
{
if (black.judge_value_2 != white.judge_value_2)
{
if (black.judge_value_2 > white.judge_value_2) printf("Black wins.\n");
if (black.judge_value_2 < white.judge_value_2) printf("White wins.\n");
}
else
{
if (black.judge_value_3 != white.judge_value_3)
{
if (black.judge_value_3 > white.judge_value_3) printf("Black wins.\n");
if (black.judge_value_3 < white.judge_value_3) printf("White wins.\n");
}
else
{
if (black.judge_value_4 != white.judge_value_4)
{
if (black.judge_value_4 > white.judge_value_4) printf("Black wins.\n");
if (black.judge_value_4 < white.judge_value_4) printf("White wins.\n");
}
else
{
if (black.judge_value_5 > white.judge_value_5) printf("Black wins.\n");
if (black.judge_value_5 < white.judge_value_5) printf("White wins.\n");
if (black.judge_value_5 == white.judge_value_5) printf("Tie.\n");
}
}
}
}
}
else
{
if (black.judge_value > white.judge_value) printf("Black wins.\n");
if (black.judge_value < white.judge_value) printf("White wins.\n");
if (black.judge_value == white.judge_value) printf("Tie.\n");
}
}
}
}