德州扑克

德州扑克

题目描述:
五张牌,每张牌由牌大小和花色组成,牌大小 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值