zoukankan      html  css  js  c++  java
  • 拱猪计分的题解

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

    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 分。其余三家均得零分。

    分析

    典型的大模拟。

    明白了什么叫 1h1h 读题,0.2h0.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;
        }
    }
    

    我们用 cardi,jcard_{i,j} 记录第 ii 个人,有没第 jj 张得分牌。

    计分

    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;
    }
    
  • 相关阅读:
    字符串方法
    函数的属性和方法
    数组的去重!!
    常见的数组方法
    JS中的函数
    JavaScript 中表达式和语句的区别
    运算符优先级
    题解 CF813B 【The Golden Age】
    题解 CF834B 【The Festive Evening】
    题解 CF810B 【Summer sell-off】
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12816945.html
Copyright © 2011-2022 走看看