[UVA] 12366 - King's Poker
King's Poker
King's Poker |
Poker is one of the most widely played card games, and King's Poker is one of its variations. The game is played with a normal deck of 52 cards. Each card has one of 4 suits and one of 13 ranks. However, in King's Poker card suits are not relevant, while ranks are Ace (rank 1), 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack (rank 11), Queen (rank 12) and King (rank 13). The name of the game comes from the fact that in King's Poker, the King is the highest ranked card. But this is not the only difference between regular Poker and King's Poker. Players of King's Poker are dealt a hand of just three cards. There are three types of hands:
- A set, made of three cards of the same rank.
- A pair, which contains two cards of the same rank, with the other card unmatched.
- A no-pair, where no two cards have the same rank.
Hands are ranked using the following rules:
- Any set defeats any pair and any no-pair.
- Any pair defeats any no-pair.
- A set formed with higher ranked cards defeats any set formed with lower ranked cards.
- If the matched cards of two pairs have different ranks, then the pair with the higher ranked matched cards defeats the pair with the lower ranked matched cards.
- If the matched cards of two pairs have the same rank, then the unmatched card of both hands are compared; the pair with the higher ranked unmatched card defeats the pair with the lower ranked unmatched card, unless both unmatched cards have the same rank, in which case there is a tie.
A new software house wants to offer King's Poker games in its on-line playing site, and needs a piece of software that, given a hand of King's Poker, determines the set or pair with the lowest rank that beats the given hand. Can you code it?
Input
Each test case is described using a single line. The line contains three integers A, B, and C representing the ranks of the cards dealt in a hand ( 1A, B, C13).
The last test case is followed by a line containing three zeros.
Output
For each test case output a single line. If there exists a set or a pair that beats the given hand, write the lowest ranked such a hand. The beating hand must be written by specifying the ranks of their cards, in non-decreasing order. If no set or pair beats the given hand, write the character `*' (asterisk).
Sample Input
1 1 1 1 1 12 1 1 13 1 13 1 10 13 10 1 2 2 13 13 13 13 12 13 12 12 12 3 1 4 1 5 9 0 0 0
Sample Output
2 2 2 1 1 13 1 2 2 1 2 2 1 11 11 2 2 3 * 1 1 1 13 13 13 1 1 2 1 1 2
輸出能勝過這組手牌的最小手牌。
特別 case 會進位的可能即可。
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int a, b, c;
while(scanf("%d %d %d", &a, &b, &c) == 3) {
if(a + b + c == 0) break;
int v[3] = {a, b, c};
sort(v, v+3);
if(v[0] == v[2]) {
if(v[0] == 13)
puts("*");
else
printf("%d %d %d\n", a+1, a+1, a+1);
continue;
}
if(v[0] == v[1]) {
v[2]++;
if(v[2] > 13)
v[0]++, v[1]++, v[2] = 1;
sort(v, v+3);
if(v[0] == v[2]) v[2]++;
printf("%d %d %d\n", v[0], v[1], v[2]);
continue;
}
if(v[1] == v[2]) {
if(v[0] == 12 && v[1] == 13)
puts("1 1 1");
else {
v[0]++;
if(v[0] > 13)
v[1]++, v[2]++, v[0] = 1;
sort(v, v+3);
if(v[0] == v[2]) v[2]++;
printf("%d %d %d\n", v[0], v[1], v[2]);
}
continue;
}
puts("1 1 2");
}
return 0;
}