第九周作业 B题

B-东东学打牌

题目描述:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解题思路:看这道题就觉得很熟悉,和之前做过的一道大模拟判断牌的方法是一样的,我就想到在之前的代码基础上更改。只需要增加记录大小的量还有判断大小的方法就可以了
首先得记录他是哪一手牌,这是第一判定条件
其次分析如果属于同样的手牌有什么样的判定方式
例如:3.两对,首先我们判断第一大对的值记为aa,其次记录第二对的值记为bb,再次记录剩下一张单牌的值记为sum,最后在比较大小的时候就可以直接用了

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
 
struct player{
	string name;
	int pai[5];
	int level;
	int aa,bb,sum;
	bool operator<(player& t) const
	{
		if(level!=t.level) return level<t.level;
		if(aa!=t.aa) return aa<t.aa;
		if(bb!=t.bb) return bb<t.bb;
		if(sum!=t.sum) return sum<t.sum;
		return name>t.name;
	}
	void cc(string s);
	void check();
}wanjia[100010];
void player::check()
{		
	int a[5];
	for(int i=0;i<5;i++)
		a[i]=pai[i];
	if(a[4]==a[3]+1&&a[3]==a[2]+1&&a[2]==a[1]+1&&a[1]==a[0]+1)	//顺子 
	{
		level=7;
		aa=a[4];
		bb= sum=0;
		return;
	}
	else if(a[4]==13&&a[3]==12&&a[2]==11&&a[1]==10&&a[0]==1)			//龙顺
	{
		 level=8;
		 aa= bb= sum=0;
		return;
	 } 
	else if(a[0]==a[1]&&a[0]==a[2]&&a[0]==a[3])                //炸弹1
	{
		 level=6;
		 aa=a[0];
		bb=a[4];
		sum=0;
	}
	else if(a[1]==a[2]&&a[1]==a[3]&&a[1]==a[4])                 //炸弹2
	{
		level=6;
		aa=a[1];
		bb=a[0];
		 sum=0;
		return;
	 } 
	else if(a[0]==a[1]&&a[0]==a[2]&&a[3]==a[4])      	//三带二1
	{
		 level=5;
		 aa=a[0];
		 bb=a[3];
		 sum=0;
		return;
	}												
	else if(a[0]==a[1]&&a[2]==a[3]&&a[2]==a[4])        	//三带二2
	{
		 level=5;
		 aa=a[2];
		 bb=a[0];
		 sum=0;
		return;	
	}
	else if(a[0]==a[1]&&a[0]==a[2])					//三个1 
	{
		 level=4;
		 aa=a[0];
		 bb=0;
		 sum=a[3]+a[4];
		return;
	}
	else if(a[1]==a[2]&&a[1]==a[3])                 //三个2
	{
		 level=4;
		 aa=a[1];
		 bb=0;
		 sum=a[0]+a[4];
		return;
	}
	else if(a[2]==a[3]&&a[2]==a[4])					//三个3
	{
		 level=4;
		 aa=a[2];
		 bb=0;
		 sum=a[0]+a[1];
		return;
	}
	else if(a[0]==a[1]&&a[2]==a[3])			//两对,已经排除三带二1
	{
		 level=3;
		 aa=a[2];
		 bb=a[0];
		 sum=a[4];
		return;
	}
	else if(a[0]==a[1]&&a[3]==a[4])				//两对,已经排除三带二2
	{
		 level=3;
		 aa=a[3];
		 bb=a[0];
		 sum=a[2];
		return;
	}
	else if(a[1]==a[2]&&a[3]==a[4])				//两对,已经排除三带二3
	{
		 level=3;
		 aa=a[3];
		 bb=a[1];
		 sum=a[0];
		return;
	}
	else if(a[0]==a[1])         //一对1 
	{
		 level=2;
		 aa=a[0];
		 bb=0;
		 sum=a[2]+a[3]+a[4];
		return;	
	}											
	else if(a[1]==a[2])			//一对2
	{
		 level=2;
		 aa=a[1];
		 bb=0;
		 sum=a[0]+a[3]+a[4];
		return;
	}
	else if(a[2]==a[3])  		//一对3
	{
		 level=2;
		 aa=a[2];
		 bb=0;
		 sum=a[0]+a[1]+a[4];
		return;
	}
	else if(a[3]==a[4])			//一对4
	{
		 level=2;
		 aa=a[3];
		 bb=0;
		 sum=a[0]+a[1]+a[2];
		return;
	}
	else 									//大牌 
	{
		 level=1;
		 aa= bb=0;
		 sum=a[0]+a[1]+a[2]+a[3]+a[4];
	}
} 
void player::cc(string s)
{
	int tot=0;
	int n=s.size();
	for(int i=0;i<n;)
	{
		if(s[i]>='2'&&s[i]<='9')
		{
			 pai[tot++]=s[i]-'0';
			i++;
		}
		else
		{
			if(s[i]=='1')
			{
				 pai[tot++]=10;
				 i+=2;
			}
			else
			{
				if (s[i] == 'A')  pai[tot++] = 1;
				if (s[i] == 'J')  pai[tot++] = 11;
				if (s[i] == 'Q')  pai[tot++] = 12;
				if (s[i] == 'K')  pai[tot++] = 13;
				i++;
			}
			
		}
	}
	sort( pai, pai+5);
	
}
int main(){
	int n=0;
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
		{
			string name,s;
			cin>>name>>s;
			wanjia[i].name=name;
			wanjia[i].cc(s);
			wanjia[i].check();
		}
		sort(wanjia,wanjia+n);
		for(int i=n-1;i>=0;i--)
			cout<<wanjia[i].name<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值