洛谷P1148 拱猪计分

题目描述

「拱猪」是一种很有趣的扑克牌游戏。即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。

  1. 我们分别以 S,H,D,CS,H,D,C 来代表黑桃、红心、方块及梅花,并以数字 11 至 1313 来代表 A,2,…,Q,KA,2,…,Q,K 等牌点,例如:𝐻1H1​ 为红心 AA,𝑆13S13​ 为黑桃 KK;
  2. 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有「猪」𝑆12S12​,所有红心牌,「羊」𝐷11D11​ 及「加倍」𝐶10C10​ 等 1616 张牌,其它牌均弃置不计,若一位玩家未持有这 1616 张牌中任意一张,则以得零分计算;
  3. 若持有 𝐶10C10​ 牌的玩家只有该张牌而没有任何其它牌则得 +50+50 分,否则将其它计分牌所得分数加倍计算;
  4. 若红心牌不在同一家,则 𝐻1H1​ 至 𝐻13H13​ 等 1313 张牌均以负分计,其数值依次为 −50,−2,−3,−4,−5,−6,−7,−8,−9,−10,−20,−30,−40−50,−2,−3,−4,−5,−6,−7,−8,−9,−10,−20,−30,−40,且 𝑆12S12​ 与 𝐷11D11​ 的分值分别以 −100−100 及 +100+100 分计算;
  5. 若红心牌 𝐻1H1​ 至 𝐻13H13​ 均在同一家,则有下列情形:
  • 所有红心牌以 +200+200 分计算。
  • 若 𝑆12,𝐷11S12​,D11​ 皆在吃下所有红心牌之一家,则此玩家得 +500+500 分。
  • 𝐶10C10​ 牌依旧以前文所述原则计算。

例一:若各玩家持有计分牌如下:

  1. S12 H3 H5 H13
  2. D11 H8 H9
  3. C10 H1 H2 H4 H6 H7
  4. H10 H11 H12

则各家之得分依序为:−148,+83,−138−148,+83,−138 及 −60−60。

例二:若各玩家持有计分牌如下:

  1. H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
  2. S12 C10
  3. D11

则各家之得分依序为:+200,−200,+100+200,−200,+100 及 00。

例三:若有一玩家持有所有 1616 张计分牌,则得 +1000+1000 分,其余三家均得零分。

输入格式

每个输入文件包含多组数据。

每组数据有四行,分别描述一个玩家。

每一行,第一个数为该玩家所持有计分牌总数,随后若干个符合题意的字符串描述其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。

相邻两组测试数据之间不包含空白行。若四家持牌数均为 00,表示输入文件的结束。

输出格式

每一行表示一组数据对应的结果,依次输出各家所得分数,共 44 个整数,若非 00 则包含正负号;相邻两个整数之间以一个空格分开。

符号和数字间不带空格。每组数据的输出间不带空白行。

输入输出样例

输入 #1

4  S12  H3  H5  H13
3  D11  H8  H9
6  C10  H1  H2  H4  H6  H7
3  H10  H11 H12
13 H1  H2  H3  H4  H5  H6  H7  H8  H9  H10  H11  H12  H13  
2  S12  C10
1  D11
0
0
0
0
0

输出 #1

-148 +83 -138 -60
+200 -200 +100 0

Code:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
#define N 105
int proc(int n)//n:有n张牌 
{
	string s;
	int score = 0;
	bool h[20] = {}, s12 = false, d10 = false, c10 = false;//h[1]~p[13]:H1~H13 是否存在  
	int pt[15] = {0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40};//pt[i]:牌Hi的分数 
	for(int i = 1; i <= n; ++i)
	{
		cin >> s;
		if(s[0] == 'H')
			h[stoi(s.substr(1))] = true;//标记h[i]为真 
		else if(s[0] == 'S')
			s12 = true;
		else if(s[0] == 'D')//D10与D11都认为是D10 
			d10 = true;
		else if(s[0] == 'C')
			c10 = true;
	}
	bool hasAllH = true;//是否有所有13张H牌 
	for(int i = 1; i <= 13; ++i)
		if(h[i] == false)
		{
			hasAllH = false;
			break;
		}
	if(hasAllH)//如果有全部13张红心牌 
	{
		score = 200;//全红心牌加200 
		if(s12 && d10)//如果同时有S牌和D牌 
			score = 500;
		else if(s12)//如果只有S,那么减100 
			score -= 100;
		else if(d10)//如果只有D,那么加100 
			score += 100;
		if(c10)//如果有C牌,分数乘2 
			score *= 2;
	}
	else//如果并没有持有所有的红心牌 
	{
		for(int i = 1; i <= 13; ++i)
			if(h[i])//如果有Hi这张牌 
				score += pt[i];
		if(score == 0 && !s12 && !d10 && c10)//如果只有C牌没有其它牌 
			score += 50;
		else
		{
			if(s12)//如果有S牌 
				score -= 100;
			if(d10)//如果有D牌 
				score += 100;
			if(c10)//如果有C牌 
				score *= 2;
		}
	}
	return score;
}
int main()
{
	bool isOver;
	int n, score[5];//score[i]:某局游戏后第i名玩家的得分 
	while(true)
	{
		isOver = true;
		for(int i = 1; i <= 4; ++i)
		{
			cin >> n;
			if(n != 0)
				isOver = false;
			score[i] = proc(n);//求出第i名玩家的得分 
		}
		if(isOver)//如果输入4个0,则跳出 
			break;
		for(int i = 1; i <= 4; ++i)//输出每位玩家的得分 
			cout << (score[i] > 0 ? "+" : "") << score[i] << ' ';//如果是正数则输出正号 
		cout << endl;
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值