拱猪计分的题解

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

  1. 我们分别以 S、H、D 及 C 来代表黑桃,红心,方块及梅花,并以数字 1 至 13 来代表 A、2、…、Q、K 等牌点,例如︰ H1 为红心 A,S13 为黑桃 K。
  2. 牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有 S12 (猪),所有红心牌,D11 (羊)及 C10 (加倍)等16张牌。其它牌均弃置不计。若未持有这 16 张牌之任一张则以得零分计算。
  3. 若持有 C10 的玩家只有该张牌而没有任何其它牌则得 +50 分,若除了 C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。
  4. 若红心牌不在同一家,则 H1 至 H13 等 13 张牌均以负分计,其数值为 -50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且 S12 与 D11 分别以 -100 及 +100 分计算。
  5. 若红心牌 H1 至H13 均在同一家,有下列情形︰
    • 所有红心牌以+200分计算。
    • 若 S12、D11 皆在吃下所有红心牌之一家,则此玩家得 +500 分。
    • 而 C10 还是以前面所述原则计算之。

例一:若各玩家持有计分牌如下:(每列代表一玩家所持有之牌)
S12 H3 H5 H13
D11 H8 H9
C10 H1 H2 H4 H6 H7
H10 H11 H12
则各家之得分依序为:-148、+83、-138 及 -60。
例二:若各玩家持有计分牌如下:(第四家未持有任何计分牌)
H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
S12 C10
D11
则各家之得分依序为:+200、-200、+100 及 0。
例三:若有一玩家持有所有 16 张计分牌,则得 +1000 分。其余三家均得零分。

分析

典型的大模拟。

明白了什么叫 1 h 1h 1h 读题, 0.2 h 0.2h 0.2h 写代码

我们从读入开始

读入
for(int i=1;i<=4;i++){
    read(size[i]);
    for(int j=1;j<=size[i];j++){
        char k;int p;
        cin>>k>>p;
        if(k=='H')card[i][p]=true;
        else if(k=='S')card[i][14]=true;
       		else if(k=='D')card[i][15]=true;
        		else if(k=='C')card[i][16]=true;
    }
}

我们用 c a r d i , j card_{i,j} cardi,j 记录第 i i i 个人,有没第 j j j 张得分牌。

计分
for(int i=1;i<=4;i++){
	bool flag=true;
	for(int j=1;j<=13;j++)
		if(card[i][j]==false){
			flag=false;
			break;
		}
	if(flag){//有没有红心牌
		int ans=200;//所有红心牌以+200分计算。
		if(card[i][14]&&card[i][15])ans=500;//若S12、D11皆在吃下所有红心牌之一家,则此玩家得+500分。 
		else ans=ans+card[i][14]*fraction[14]+card[i][15]*fraction[15];
		if(card[i][16])ans*=2;//若除了C10还有其它计分牌,则将其它计分牌所得分数加倍计算。 
		work(ans);//输出
		putchar(32);//输出
	}else{
		bool flg=true;
		for(int j=1;j<=15;j++)
			if(card[i][j]==true){
				flg=false;
				break;
			}
		if(flg){
			if(card[i][16])work(50);//若持有C10的玩家只有该张牌而没有任何其它牌则得+50分
			else work(0);//若未持有这16张牌之任一张则以得零分计算。 
			putchar(32);//输出
		}else{
			int ans=0;
			for(int j=1;j<=15;j++)
				if(card[i][j])ans+=fraction[j];
			if(card[i][16])ans*=2;
			work(ans);//输出
			putchar(32);//输出
		}
    }
}puts("");

总代码

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
	T RR=1;FF=0;char CH=getchar();
	for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
	for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
	FF*=RR;
}
template<typename T>void write(T x){
	if(x<0)putchar('-'),x*=-1;
	if(x>9)write(x/10);
	putchar(x%10+48);
}
void work(int x){
	if(x<0)cout<<x;
	else if(x>0)cout<<'+'<<x;
		else cout<<x;
}
const int fraction[17]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40,-100,+100,0};
int size[5];
bool card[5][17];
int main(){
	while(1){
		memset(card,false,sizeof(card));
		for(int i=1;i<=4;i++){
			read(size[i]);
			for(int j=1;j<=size[i];j++){
				char k;int p;
				cin>>k>>p;
				if(k=='H')card[i][p]=true;
				else if(k=='S')card[i][14]=true;
					else if(k=='D')card[i][15]=true;
						else if(k=='C')card[i][16]=true;
			}
		}
		if(size[1]+size[2]+size[3]+size[4]==0)return 0;
		for(int i=1;i<=4;i++){
			bool flag=true;
			for(int j=1;j<=13;j++)
				if(card[i][j]==false){
					flag=false;
					break;
				}
			if(flag){
				int ans=200;
				if(card[i][14]&&card[i][15])ans=500;
				else ans=ans+card[i][14]*fraction[14]+card[i][15]*fraction[15];
				if(card[i][16])ans*=2;
				work(ans);
				putchar(32);
			}else{
				bool flg=true;
				for(int j=1;j<=15;j++)
					if(card[i][j]==true){
						flg=false;
						break;
					}
				if(flg){
					if(card[i][16])work(50);
					else work(0);
					putchar(32);
				}else{
					int ans=0;
					for(int j=1;j<=15;j++)
						if(card[i][j])ans+=fraction[j];
					if(card[i][16])ans*=2;
					work(ans);
					putchar(32);
				}
			}
		}puts("");
	}
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值