2022 华为机试真题 C++ 实现 德州扑克

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022 华为机试真题 C++ 实现 德州扑克相关的知识,希望对你有一定的参考价值。

目录

题目

思路

核心考点

Code


题目

【德州扑克】

五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一。

判断牌型:

牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。
牌型2,四条:四张相同数字 + 单张,如红桃A黑桃A梅花A方块A + 黑桃K。
牌型3,葫芦:三张相同数字 + 一对,如红桃5黑桃5梅花5 + 方块9梅花9。
牌型4,同花:同一花色,如方块3方块7方块10方块J方块Q。
牌型5,顺子:花色不一样的顺子,如红桃2黑桃3红桃4红桃5方块6。
牌型6,三条:三张相同+两张单。

说明:

(1)五张牌里不会出现牌大小和花色完全相同的牌。
(2)编号小的牌型较大,如同花顺比四条大,依次类推。
(3)包含A的合法的顺子只有10 J Q K A和A 2 3 4 5;类似K A 2 3 4的序列不认为是顺子。

输入描述:

输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。

输出描述:

输出牌型序号,5张牌符合多种牌型时,取最大的牌型序号输出。

示例1  输入输出示例仅供调试,后台判题数据一般不包含示例

输入

4 H
5 S
6 C
7 D
8 D

输出

5

说明

4 5 6 7 8构成顺子,输出5

示例2   输入输出示例仅供调试,后台判题数据一般不包含示例

输入

9 S
5 S
6 S
7 S
8 S

输出

1

说明

既是顺子又是同花,输出1,同花顺。

思路

 * 五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一。 判断牌型:

 * 牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。

 * 牌型2,四条:四张相同数字 + 单张,如红桃A黑桃A梅花A方块A + 黑桃K。

 * 牌型3,葫芦:三张相同数字 + 一对,如红桃5黑桃5梅花5 + 方块9梅花9。

 * 牌型4,同花:同一花色,如方块3方块7方块10方块J方块Q。

 * 牌型5,顺子:花色不一样的顺子,如红桃2黑桃3红桃4红桃5方块6。

 * 牌型6,三条:三张相同 + 两张单。

 * 牌型7,其他。

 * 说明:

 * 1)五张牌里不会出现牌大小和花色完全相同的牌。

 * 2)前面的牌型比后面的牌型大,如同花顺比四条大,依次类推。

核心考点

1:排序

2:分支判定

3:STL 库

Code

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
using namespace std;

enum CardType
	CARD_TYPE_UNKNOW,
	CARD_TYPE_H,  //红桃
	CARD_TYPE_S,  //黑桃
	CARD_TYPE_C,  //梅花
	CARD_TYPE_D,  //方块
;

enum CardResult
	CARD_RESULT_TONGHUASHUN=1,
	CARD_RESULT_SITIAO,
	CARD_RESULT_HULU,
	CARD_RESULT_TONGHUA,
	CARD_RESULT_SHUNZI,
	CARD_RESULT_SANTIAO,
	CARD_RESULT_OTHER,
;

typedef struct CardInfo
	char eNum;
	CardType eType;
;

class CardRule

public:
	CardRule();
	~CardRule();
	CardResult Juge(vector<CardInfo>& vec);
	void Sort(vector<CardInfo>& vec);
	bool IsTongHua(vector<CardInfo>& vec);
	bool IsShunZi(vector<CardInfo>& vec);
	bool IsSiTiao(vector<CardInfo>& vec);
	bool IsHuLu(vector<CardInfo>& vec);
	bool IsSanTiao(vector<CardInfo>& vec);
;
CardRule::CardRule()


CardRule::~CardRule()



CardResult CardRule::Juge(vector<CardInfo>& vec)

	CardRule::Sort(vec);
	if(IsTongHua(vec) && IsShunZi(vec)) return CARD_RESULT_TONGHUASHUN;
	else if(IsTongHua(vec)) return CARD_RESULT_TONGHUA;
	else if(IsShunZi(vec)) return CARD_RESULT_SHUNZI;
	else if(IsSiTiao(vec)) return CARD_RESULT_SITIAO;
	else if(IsHuLu(vec)) return CARD_RESULT_HULU;
	else if(IsSanTiao(vec)) return CARD_RESULT_SANTIAO;
	else return CARD_RESULT_OTHER;


bool Compare(CardInfo ls,CardInfo rs)
	if(ls.eNum<rs.eNum) return true;
	return false;


void CardRule::Sort(vector<CardInfo>& vec)
	sort(vec.begin(),vec.begin(),Compare);


bool CardRule::IsTongHua(vector<CardInfo>& vec)
	for(vector<CardInfo>:: iterator it=vec.begin()+1;it!=vec.end();++it)
		if((*it).eType!=(*(it-1)).eType) return false;
	
	return true;


bool CardRule::IsShunZi(vector<CardInfo>& vec)
	for(vector<CardInfo>:: iterator it=vec.begin()+1;it!=vec.end();++it)
		if((*it).eNum-(*(it-1)).eNum!=1) return false;
	
	return true;


bool CardRule::IsSiTiao(vector<CardInfo>& vec)
	map<char,int> Cardmap;
	for(vector<CardInfo>:: iterator it=vec.begin()+1;it!=vec.end();++it)
		if(Cardmap.find((*it).eNum)==Cardmap.end())
			Cardmap[(*it).eNum]=1;
		
		else Cardmap[(*it).eNum]++;
	
	if(Cardmap.size()==2)
		for(map<char,int>::iterator it=Cardmap.begin();it!=Cardmap.end();++it)
			if((*it).second==4) return true;
		
	
	return false;


bool CardRule::IsHuLu(vector<CardInfo>& vec)
	map<char,int> Cardmap;
	for(vector<CardInfo>:: iterator it=vec.begin()+1;it!=vec.end();++it)
		if(Cardmap.find((*it).eNum)==Cardmap.end())
			Cardmap[(*it).eNum]=1;
		
		else Cardmap[(*it).eNum]++;
	
	if(Cardmap.size()==2)
		for(map<char,int>::iterator it=Cardmap.begin();it!=Cardmap.end();++it)
			if((*it).second==3) return true;
		
	
	return false;


bool CardRule::IsSanTiao(vector<CardInfo>& vec)
	map<char,int> Cardmap;
	for(vector<CardInfo>:: iterator it=vec.begin()+1;it!=vec.end();++it)
		if(Cardmap.find((*it).eNum)==Cardmap.end())
			Cardmap[(*it).eNum]=1;
		
		else Cardmap[(*it).eNum]++;
	
	if(Cardmap.size()==3)
		for(map<char,int>::iterator it=Cardmap.begin();it!=Cardmap.end();++it)
			if((*it).second==3) return true;
		
	
	return false;


CardType CardConvert(char c)
	switch(c)
		case 'H': return CARD_TYPE_H;
		case 'S': return CARD_TYPE_S;
		case 'C': return CARD_TYPE_C;
		case 'D': return CARD_TYPE_D;
		default:break;
	
	return CARD_TYPE_UNKNOW;


int spilt(string& str,char& a,char& b)
	if(str.size()<3)
		return -1;
	
	a=str[0];
	b=str[2];
	return 0;

int main()
	while(true)
		string str="";
		vector<CardInfo> vec;
		vec.clear();
		for(size_t i=0;i<5;++i)
			CardInfo st;
			memset(&st,0,sizeof(CardInfo));
			getline(cin,str);
			char cardtype;
			spilt(str,st.eNum,cardtype);
			st.eType=CardConvert(cardtype);
			if(st.eType==CARD_TYPE_UNKNOW)
				cout<<"error input!"<<endl;
				return -1;
			
			vec.push_back(st);
		
		CardRule cCard;
		cout<<cCard.Juge()<<endl;
	
	return 0;

以上是关于2022 华为机试真题 C++ 实现 德州扑克的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题 JS 实现整理扑克牌2022.11 Q4 新题

华为OD机试真题 Python 实现整理扑克牌2022.11 Q4 新题

华为OD机试真题 Java 实现整理扑克牌2022.11 Q4 新题

华为机试真题 C++ 实现斗地主之顺子

2022华为机试真题 C++ 实现单词重量

华为OD机试真题 C++ 实现优秀学员统计2022.11 Q4 新题