2022 华为机试真题 C++ 实现 德州扑克
Posted MISAYAONE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022 华为机试真题 C++ 实现 德州扑克相关的知识,希望对你有一定的参考价值。
目录
题目
【德州扑克】
五张牌,每张牌由牌大小和花色组成,牌大小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 新题