德州扑克
题目描述:
五张牌,每张牌由牌大小和花色组成,牌大小 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)编号小的牌型较大,如同花顺比四条大,依次类推。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
#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;
}