2021GDUFS新手赛F-Reinhart的德州扑克 题解

https://www.luogu.com.cn/problem/U188446

题面

题目背景

德州扑克是目前世界上最流行的扑克游戏,全世界有众多相关的比赛,例如是 WSOP,WPT,EPT等,也让这款游戏的玩法变得层出不穷,丰富多变。

不要被简单的游戏规则而误导,复杂多变的比赛状况,让这款游戏在高水平的竞技中会变得非常复杂,这也让人们为德州扑克给出了这样一句评价“用一刻就能学会,但要用一生才能掌握”。

题目描述

现在我们并不在乎游戏规则是什么,因为Reinhart是一个德州扑克高手,他对于德州扑克的规则烂熟于心,不过他每次都记不得牌型的大小关系,他知道你是一个编程高手,所以他想让你帮他写一个程序:输入五张牌的大小和花色,输出这五张牌能组成的最大牌型.你能帮帮他吗?

为了降低你的编程难度,我们规定:

  1. 输入的牌都是来源于同一副扑克牌.
  2. 输入的牌的点数都是非递减的.
  3. 所有花色没有大小之分.

下面给出各牌型,(从大到小)

  1. 皇家同花顺(ROYAL FLUSH):五张顺连的牌(点数连续单调递增),且最大的一张牌是A(Ace),并且五张牌的花色相同.
  2. 同花顺(STRAIGHT FLUSH):五张顺连的牌(点数连续单调递增),不规定最大的一张牌是A(Ace),并且五张牌的花色相同.
  3. 四条(FOUR OF A KIND):至少四张牌的点数相同.
  4. 葫芦(FULL HOUSE):至少三张牌的点数相同,并且除此之外还有两张牌的点数相同.
  5. 同花(FLUSH):五张牌的花色都相同.
  6. 顺子(STRAIGHT):五张顺连的牌(点数连续单调递增),不要求五张牌的花色相同.
  7. 特别注意:由于Reinhart是个谨慎的人,所以比三条(THREE OF A KIND)(包括三条)小的牌型Reinhart不在乎他们的大小关系,你只需要告诉Reinhart弃牌就行

输入格式

输入两行,每行五个数字,第一行的第$i$个字符表示第$i$张扑克的点数,
第二行的第$i$个数字表示第$i$张扑克花色.(保证输入的牌的点数是非递减的)

点数和对应输入的数字:

  • 2 - 10 对应 2 - 10
  • J(Jack) 对应 11
  • (Queen) 对应 12
  • K(King) 对应 13
  • A(Ace) 对应 14

花色和对应输入的数字:

  • 黑桃(Spades) 对应 1
  • 方片(Diamonds) 对应 2
  • 红桃(Hearts) 对应 3
  • 梅花(Clubs) 对应 4

输出格式

输出这五张牌能组成的最大牌型.

  • 如果最大是皇家同花顺输出”ROYAL FLUSH”
  • 如果最大是同花顺输出”STRAIGHT FLUSH”
  • 如果最大是四条输出”FOUR OF A KIND”
  • 如果最大是葫芦输出”FULL HOUSE”
  • 如果最大是同花输出”FLUSH”
  • 如果最大是顺子输出”STRAIGHT”
  • 如果最大的牌型小于等于三条输出”FOLD”,劝Reinhart弃牌.
  • 输出不包括引号

题解

  • 按照题意模拟即可,虽然题目规定输入一定是非递减输入,但要仍然要注意一些顺序问题,具体见代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<bits/stdc++.h>
using namespace std;
int n, m;
int a[15], b[15];
int main() {
for (int i = 0; i < 5; i++) {
cin >> a[i];
}
for (int i = 0; i < 5; i++) {
int x;
cin >> x;
b[x]++;
}
int ma = 0;
for (int i = 0; i < 4; i++) {
ma = max(ma, b[i]);
}
if ((a[0] + 1 == a[1] && a[1] + 1 == a[2] && a[2] + 1 == a[3] && a[3] + 1 == a[4]) && ma == 5 && a[4] == 14) {
cout << "ROYAL FLUSH";
return 0;
}
if ((a[0] + 1 == a[1] && a[1] + 1 == a[2] && a[2] + 1 == a[3] && a[3] + 1 == a[4]) && ma == 5) {
cout << "STRAIGHT FLUSH";
return 0;
}
if ((a[0] == a[1] && a[0] == a[2] && a[0] == a[3]) || (a[1] == a[2] && a[1] == a[3] && a[1] == a[4])) {
cout << "FOUR OF A KIND";
return 0;
}
if ((a[0] == a[1] && a[0] == a[2] && a[3] == a[4]) || (a[2] == a[3] && a[2] == a[4] && a[0] == a[1])) {
cout << "FULL HOUSE";
return 0;
}
if (ma == 5) {
cout << "FLUSH";
return 0;
}
if (a[0] + 1 == a[1] && a[1] + 1 == a[2] && a[2] + 1 == a[3] && a[3] + 1 == a[4]) {
cout << "STRAIGHT";
return 0;
}
cout << "FOLD";
return 0;
}