week9 B - 东东学打牌

题目

样例输入

3
DongDong AAA109
ZJM 678910
Hrz 678910

样例输出

Hrz
ZJM
DongDong

 

思路

暴力算...

首先用map存储不同的牌面和对应的数字,就是10比较麻烦,可以这样处理:因为1输入作'A',因此当输入中有1时只可能是10。所以读到1的时候,转换为10,并跳过一位。

为每个人建立结构体,存储name、type以及多level的分数。通过多关键字排名来计算。

再处理牌面的时候,统计出现了什么数字的牌面,以及每一张牌面的个数。

然后从type9这种优先级高的开始暴力处理就成了...

 

代码

#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;

map<char, int> poker;

struct score
{
	string name;
	int type;
	int scorr1 = 0;
	int scorr2 = 0;
	int scorr3 = 0;
	bool operator<(const struct score &p)const
	{
		if (type != p.type)
			return type > p.type;
		if (scorr1 != p.scorr1)
			return scorr1 > p.scorr1;
		if (scorr2 != p.scorr2)
			return scorr2 > p.scorr2;
		if (scorr3 != p.scorr3)
			return scorr3 > p.scorr3;
		return name < p.name;
	}
}score[100010];

struct p
{
	int poker;
	int num;
	p(int poker = 14, int num = 0)
	{
		this->poker = poker;
		this->num = num;
	}
	bool operator<(const struct p &a)const
	{
		return poker < a.poker;
	}
};

int main()
{
	poker['A'] = 1;
	poker['2'] = 2;
	poker['3'] = 3;
	poker['4'] = 4;
	poker['5'] = 5;
	poker['6'] = 6;
	poker['7'] = 7;
	poker['8'] = 8;
	poker['9'] = 9;
	poker['J'] = 11;
	poker['Q'] = 12;
	poker['K'] = 13;

	int n;
	cin >> n;
	string str;
	for (int i = 0; i < n; i++)
	{
		cin >> score[i].name;
		cin >> str;
		struct p po[5];
		int k = 0;
		int nn = 0;
		for (int j = 0; j < 5; j++, k++)
		{	
			int poo;
			if (str[k] == '1')
			{
				k++;
				poo = 10;
			}
			else poo = poker[str[k]];
			//cout << "poo:" << poo << endl;
			for (int v = 0; v < 5; v++)
			{
				if (po[v].poker == poo)
				{
					po[v].num++;
					break;
				}
				else if (po[v].poker == 14)
				{
					po[v].poker = poo;
					po[v].num++;
					nn++;
					break;
				}
			}
			sort(po, po + nn);
		}
		/*
		for (int j = 0; j < 5; j++)
		{
			cout << "po" << j << ":  ";
			cout << "牌面:" << po[j].poker << " 数目:" << po[j].num << endl;
		}
		cout << "nn:" << nn <<endl;
		*/
		if (nn == 5 && po[0].poker == 1 && po[1].poker == 10 && po[4].poker == 13)//龙顺
			score[i].type = 8;
		else if (nn == 5 && po[4].poker - po[0].poker == 4)//顺子
		{
			score[i].type = 7;
			score[i].scorr1 = po[4].poker;
		}
		else if (nn == 2 && (po[0].num == 4 || po[1].num == 4))//炸弹
		{
			score[i].type = 6;
			if (po[0].num == 4)
			{
				//cout << "case1 " <<po[0].num<< endl;
				score[i].scorr1 = po[0].poker;
				score[i].scorr2 = po[1].poker;
			}
			else
			{
				//cout << "case2" << po[0].num << endl;
				score[i].scorr2 = po[0].poker;
				score[i].scorr1 = po[1].poker;
			}
		}
		else if (nn == 2 && (po[0].num == 3 || po[1].num == 3))//三带二
		{
			score[i].type = 5;
			if (po[0].num == 3)
			{
				score[i].scorr1 = po[0].poker;
				score[i].scorr2 = po[1].poker;
			}
			else
			{
				score[i].scorr2 = po[0].poker;
				score[i].scorr1 = po[1].poker;
			}
		}
		else if (nn == 3 && (po[0].num == 3 || po[1].num == 3 || po[2].num == 3))
		{//三个
			score[i].type = 4;
			if (po[0].num == 3)
			{
				score[i].scorr1 = po[0].poker;
				score[i].scorr2 = po[1].poker + po[2].poker;
			}
			else if (po[1].num == 3)
			{
				score[i].scorr1 = po[1].poker;
				score[i].scorr2 = po[0].poker + po[2].poker;
			}
			else
			{
				score[i].scorr1 = po[2].poker;
				score[i].scorr2 = po[0].poker + po[1].poker;
			}
		}
		else if (nn == 3 && ((po[0].num == 2 && po[1].num == 2) || (po[0].num == 2 && po[2].num == 2) || 
			   (po[1].num == 2 && po[2].num == 2)))
		{//两对
			score[i].type = 3;
			if (po[0].num == 2 && po[1].num == 2)
			{
				score[i].scorr1 = max(po[0].poker, po[1].poker);
				score[i].scorr2 = min(po[0].poker, po[1].poker);
				score[i].scorr3 = po[2].poker;
			}
			else if (po[0].num == 2 && po[2].num == 2)
			{
				score[i].scorr1 = max(po[0].poker, po[2].poker);
				score[i].scorr2 = min(po[0].poker, po[2].poker);
				score[i].scorr3 = po[1].poker;
			}
			else
			{
				score[i].scorr1 = max(po[1].poker, po[2].poker);
				score[i].scorr2 = min(po[1].poker, po[2].poker);
				score[i].scorr3 = po[0].poker;
			}
		}
		else if (nn = 4 && (po[0].num == 2 || po[1].num == 2 || po[2].num == 2 || po[3].num == 2))
		{//对
			score[i].type = 2;
			if (po[0].num == 2)
			{
				score[i].scorr1 = po[0].poker;
				score[i].scorr2 = po[1].poker + po[2].poker + po[3].poker;
			}
			else if (po[1].num == 2)
			{
				score[i].scorr1 = po[1].poker;
				score[i].scorr2 = po[0].poker + po[2].poker + po[3].poker;
			}
			else if (po[2].num == 2)
			{
				score[i].scorr1 = po[2].poker;
				score[i].scorr2 = po[0].poker + po[1].poker + po[3].poker;
			}
			else
			{
				score[i].scorr1 = po[3].poker;
				score[i].scorr2 = po[0].poker + po[1].poker + po[2].poker;
			}
		}
		else
		{
			score[i].type = 1;
			score[i].scorr1 = po[0].poker + po[1].poker + po[2].poker + po[3].poker + po[4].poker;
		}
	}
	sort(score, score + n);
	
	for (int i = 0; i < n; i++)
		cout << score[i].name << endl;
	system("Pause");
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值