Namomo Spring Camp Div2 Week1 - 第五次打卡

105 Alice的德州扑克

德州扑克是目前世界上最流行的扑克游戏,全世界有众多相关的比赛,例如是 WSOP,WPT,EPT等,也让这款游戏的玩法变得层出不穷,丰富多变。 不要被简单的游戏规则而误导,复杂多变的比赛状况,让这款游戏在高水平的竞技中会变得非常复杂,这也让人们为德州扑克给出了这样一句评价 ”用一刻就能学会,但要用一生才能掌握” 。

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

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

  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. 特别注意:由于 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
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 3e5+9;
pairs[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");
}

你可能感兴趣的:(算法,c++,蓝桥杯)