德州扑克 C/C++

最近,阿夸迷于德州扑克。所以她找到了很多人和她一起玩。由于人数众多,阿夸必须更改游戏规则:
所有扑克牌均只看数字,不计花色。
每张卡的值为1、2、3、4、5、6、7、8、9、10、11、12、13 中的一种(对应A,2、3、4、5、6、7, 8、9、10,J,Q,K)
每位玩家从一副完整的扑克牌(没有大小王)中抽出五张扑克牌,可能出现的手牌的值从低到高排列如下:

高牌:不包含以下牌的牌。对于都是高牌的牌,按照五张牌的值的和进行从大到小排序。
对子:手中的5张牌中有2张相同值的牌。对于都拥有对子的牌,按构成该对子的牌的值进行从大到小地排序。如果这些都相同,则按手牌中余下3张牌的值的和进行从大到小排序。**
两对:手中拥有两对不同的对子。对于都包含两对的手牌,按其最高对子的值进行从大到小排序。如果最高对子相同,则按另一个对子的值从大到小地进行排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
三条:手中拥有3张相同值的牌。对于都包含三条的手牌按构成三条的牌的值进行从大到小地排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
满堂红:手中拥有一个三条和一个对子。同理,先按三条大小排序,如果三条大小相同,则按对子大小进行排序。
四条:手中拥有4张相同值的牌。对于都包含四条的手牌按构成四条的牌的值进行从大到小地排序。如果这些值相同,则按剩余牌的值从大到小地进行排序。
顺子:手中拥有5张连续值的卡。对于都包含顺子的手牌按顺子最大的牌进行排序。
皇家同花顺:手中拥有10到A(10、J、Q、K、A)。是最大的手牌!**

现在,阿夸已经知道了每个人的手牌,她想要知道所有人的排名列表。如果玩家的手牌大小相等,则按玩家名字的字典序输出。保证没有重复的名字。你能帮帮她吗?

输入格式:

第一行包含一个正整数 N (1<=N<=100000) ,表示玩家的人数。

接下来 N 行,每行包含两个字符串:m (1<=|m|<=10 ) ,表示玩家的名字;s (1<=|s|<=10),表示玩家的手牌。

输出格式:

输出 N个玩家的排名列表。

输入样例:

3
Alice AAA109
Bob 678910
Boa 678910

输出样例:

Boa
Bob
Alice

代码:

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
const char book[14]="A234567891JQK";
map<char,int>mp;
struct node{
	string name,book;
	char num[5];
	int type;
};
bool cmp1(char e,char d){
	return mp[e]<mp[d];
}
char tong(char num[],int n){//有n张相同的牌 
	char c;
	int max=0;
	map<char,int>mp1;
	for(int i=0;i<5;i++){
		mp1[num[i]]++;
		if(mp1[num[i]]>max){
			max=mp1[num[i]];
			c=num[i];
		}
		if(max==n)	return c;
	}
	return 0;
}
bool shun(char num[]){//判断顺子 
	for(int i=1;i<5;i++){
		if(mp[num[i]]!=(mp[num[i-1]]+1))	return false;
	}
	return true;
}
bool royal(char num[]){//判断皇家同花顺
	string r="A1JQK";
	string s(num,num+5);//不能直接=num,num有6位 
	if(s==r)	return true;
	return false;
}
// 
int f(char num[]){
	if(royal(num))	return 8;//皇家同花顺
	if(shun(num))	return 7;//顺子
	if(tong(num,4))	return 6;//四条
	if(tong(num,3)){
		char c=tong(num,3);
		char t='?';
		for(int i=0;i<5;i++){
			if(num[i]!=c){
				if(num[i]==t)	return 5;//满堂红 
				t=num[i];
			}
		}
		return 4;//三条 
	}
	if(tong(num,2)){
		int s=0;
		for(int i=1;i<5;i++){
			if(num[i]==num[i-1])
				s++;
		}
		if(s==2)	return 3;//两对 
		return 2;//对子 
	}
	return 1;//高牌 
}
// 
bool cmp(node a,node b){
	if(a.book!=b.book){
		int na=a.type,nb=b.type;
		//cout<<na<<nb<<endl;//
		if(na==nb){
			if(na==8)	return a.name<b.name;
			if(na==7){
				if(a.num[4]!=b.num[4])	return mp[a.num[4]]>mp[b.num[4]];
				return a.name<b.name;
			}
			if(na==6){//TL警告 
				char sa,sb,da,db;
				da=sa=tong(a.num,4);db=sb=tong(b.num,4);
				if(sa!=sb)	return mp[sa]>mp[sb];
				else{
					for(int i=0;i<5;i++)	if(a.num[i]!=sa)	da=a.num[i];
					for(int i=0;i<5;i++)	if(b.num[i]!=sb)	db=b.num[i];
					if(da!=db)	return mp[da]>mp[db];
				}
				return a.name<b.name;
			}
			if(na==5){
				char sa,sb,da,db;
				sa=tong(a.num,3);sb=tong(b.num,3);
				if(sa!=sb)	return mp[sa]>mp[sb];
				else{
					for(int i=0;i<5;i++)	if(a.num[i]!=sa)	da=a.num[i];
					for(int i=0;i<5;i++)	if(b.num[i]!=sb)	db=b.num[i];
					if(da!=db)	return mp[da]>mp[db];
				}
				return a.name<b.name;
			}
			if(na==4){
				char sa,sb;
				int da=0,db=0;
				sa=tong(a.num,3);sb=tong(b.num,3);
				if(sa!=sb)	return mp[sa]>mp[sb];
				else{
					for(int i=0;i<5;i++)	if(a.num[i]!=sa)	da+=mp[a.num[i]];
					for(int i=0;i<5;i++)	if(b.num[i]!=sb)	db+=mp[b.num[i]];
					if(da!=db)	return da>db;
				}
				return a.name<b.name;
			}
			if(na==3){
				char a1,a2,b1,b2,da,db;
				if(a.num[4]!=a.num[3]){
					a1=a.num[3];a2=a.num[0];da=a.num[4];
				}else{
					a1=a.num[4];
					if(a.num[0]==a.num[1]){
						a2=a.num[0];da=a.num[2];
					}else{
						a2=a.num[1];da=a.num[0];
					}
				}
				if(b.num[4]!=b.num[3]){
					b1=b.num[3];b2=b.num[0];db=b.num[4];
				}else{
					b1=b.num[4];
					if(b.num[0]==b.num[1]){
						b2=b.num[0];db=b.num[2];
					}else{
						b2=b.num[1];db=b.num[0];
					}
				}
				if(a1!=b1)	return mp[a1]>mp[b1];
				if(a2!=b2)	return mp[a2]>mp[b2];
				if(da!=db)	return mp[da]>mp[db];
				return a.name<b.name;
			}
			if(na==2){
				char sa=tong(a.num,2),sb=tong(b.num,2);
				int ssa=0,ssb=0;
				if(sa!=sb)	return mp[sa]>mp[sb];
				for(int i=0;i<5;i++){
					if(sa!=a.num[i]){
						ssa+=mp[a.num[i]];
					}
					if(sb!=b.num[i]){
						ssb+=mp[b.num[i]];
					}
				}
				if(ssa!=ssb)	return ssa>ssb;
				return a.name<b.name;
			}
			if(na==1){
				int sa=0,sb=0;
				for(int i=0;i<5;i++){
					sa+=mp[a.num[i]];sb+=mp[b.num[i]];
				}
				if(sa!=sb)	return sa>sb;
				return a.name<b.name;
			}
		}
		return na>nb;
	}
	return a.name<b.name;
}
//
int main(){
	mp['A']=1;mp['2']=2;mp['3']=3;mp['4']=4;mp['5']=5;mp['6']=6;mp['7']=7;mp['8']=8;mp['9']=9;mp['1']=10;mp['J']=11;mp['Q']=12;mp['K']=13;
	int n;cin>>n;
	node a[n];
	for(int i=0;i<n;i++){
		cin>>a[i].name>>a[i].book;
		int k=0;
		for(int j=0;j<a[i].book.size();j++){
			if(a[i].book[j]!='0')	a[i].num[k++]=a[i].book[j];
		}
        sort(a[i].num,a[i].num+5,cmp1);
        a[i].type=f(a[i].num);
	}
	sort(a,a+n,cmp);
	for(int i=0;i<n;i++){
		cout<<a[i].name<<endl;
	}
}
发布了23 篇原创文章 · 获赞 8 · 访问量 1374

猜你喜欢

转载自blog.csdn.net/qq_45550552/article/details/104542869