105 | Alice的德州扑克 |
德州扑克是目前世界上最流行的扑克游戏,全世界有众多相关的比赛,例如是 WSOP,WPT,EPT等,也让这款游戏的玩法变得层出不穷,丰富多变。 不要被简单的游戏规则而误导,复杂多变的比赛状况,让这款游戏在高水平的竞技中会变得非常复杂,这也让人们为德州扑克给出了这样一句评价 ”用一刻就能学会,但要用一生才能掌握” 。
现在我们并不在乎游戏规则是什么,因为 Alice 是一个德州扑克高手,他对于德州扑克的规则烂熟于心,不过他每次都记不得牌型的大小关系,他知道你是一个编程高手,所以他想让你帮他写一个程序:输入五张牌的大小和花色,输出这五张牌能组成的最大牌型.你能帮帮他吗?
为了降低你的编程难度,我们规定:
输入的牌都是来源于同一副扑克牌
输入的牌的点数都是非递减的
所有花色没有大小之分
下面给出各牌型,(从大到小)
皇家同花顺(ROYAL FLUSH):五张顺连的牌(点数连续单调递增),且最大的一张牌是A(Ace),并且五张牌的花色相同
同花顺(STRAIGHT FLUSH):五张顺连的牌(点数连续单调递增),不规定最大的一张牌是A(Ace),并且五张牌的花色相同
四条(FOUR OF A KIND):至少四张牌的点数相同
葫芦(FULL HOUSE):至少三张牌的点数相同,并且除此之外还有两张牌的点数相同
同花(FLUSH):五张牌的花色都相同
顺子(STRAIGHT):五张顺连的牌(点数连续单调递增),不要求五张牌的花色相同
特别注意:由于 Alice 是个谨慎的人,所以比 三条(THREE OF A KIND) (包括三条) 小的牌型 Alice 不在乎他们的大小关系,你只需要告诉 Alice 弃牌就行
输入格式
输入两行,每行五个数字,第一行的第 i 个字符表示第 i 张扑克的点数,
第二行的第 i 个数字表示第 i 张扑克花色。(保证输入的牌的点数是非递减的,且所有输入均合法)。
点数和对应输入的数字:
- 2−10 对应 2 - 10
- J(Jack) 对应 11
- Q(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",劝 Alice 弃牌
- 输出不包括引号
样例输入1
10 11 12 13 14 1 1 1 1 1
样例输出1
ROYAL FLUSH
样例输入2
10 11 12 13 14 1 2 1 3 4
样例输出2
STRAIGHT
样例输入3
6 6 6 7 7 1 2 3 1 3
样例输出3
FULL HOUSE
样例输入4
3 3 6 6 9 1 2 1 2 1
样例输出4
FOLD
AC代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 3e5+9;
pair<int,int>s[6];
int color[5];
int point[15];
int main()
{
for(int i = 1;i<=5;i++)
scanf("%d",&s[i].first);
for(int i = 1;i<=5;i++)
scanf("%d",&s[i].second);
for(int i = 1;i<=5;i++)
{
point[s[i].first]++;
color[s[i].second]++;
}
bool same_col = 0;
for(int i = 1;i<=4;i++)
{
if(color[i]==5)
{
same_col = 1;
break;
}
}
bool ord = 0;//顺子
for(int i = 1;i<=10;i++)//14-5+1
{
if(point[i]==point[i+1]&&point[i]==point[i+2]&&
point[i]==point[i+3]&&
point[i]==point[i+4]&&
point[i]!=0)
{
ord = 1;
break;
}
}
bool four = 0,three = 0,two = 0;
for(int i = 1;i<=14;i++)
{
if(point[i] == 4) four = 1;
if(point[i] == 3) three = 1;
if(point[i] == 2) two = 1;
}
//----------------------------------------
//开始按牌型大->小 进行判断
//1
if(same_col&&ord&&point[14])
{
printf("ROYAL FLUSH\n");
return 0;
}
//2
if(same_col&&ord)
{
printf("STRAIGHT FLUSH\n");
return 0;
}
//3
if(four)
{
printf("FOUR OF A KIND\n");
return 0;
}
//4
if(three&&two)
{
printf("FULL HOUSE\n");
return 0;
}
//5
if(same_col)
{
printf("FLUSH\n");
return 0;
}
//6
if(ord)
{
printf("STRAIGHT\n");
return 0;
}
printf("FOLD\n");
}