题解 P1148 【拱猪计分】

2026-01-21 05:39:10

题解 P1148 【拱猪计分】

龚祖豪曾用号

·

2020-11-01 15:12:30

·

题解

题意:

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

我们分别以S、H、D 及 C 来代表黑桃,红心,方块及梅花,并以数字 1 至 13 来代表 A、2、…、Q、K 等牌点,例如︰ H1 为红心 A,S13 为黑桃 K。

牌局结束时,由各玩家持有的有关计分的牌(计分牌)仅有 S12 (猪),所有红心牌,D11 (羊)及 C10 (加倍)等16张牌。其它牌均弃置不计。若未持有这 16 张牌之任一张则以得零分计算。

若持有 C10 的玩家只有该张牌而没有任何其它牌则得 +50 分,若除了 C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。

若红心牌不在同一家,则 H1 至 H13 等 13 张牌均以负分计,其数值为 -50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40。而且 S12 与 D11 分别以 -100 及 +100 分计算。

若红心牌 H1 至H13 均在同一家,有下列情形︰

1. 所有红心牌以+200分计算。

2. 若 S12、D11 皆在吃下所有红心牌之一家,则此玩家得 +500 分。

3. 而 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、在所有的红桃牌都在一个玩家的手中时,S12 和 D11仍旧分别以 -100 和 +100 计分,这里被坑了好久。。。。。。

2、输出时千万记得把+和-输在数字前面o(╥﹏╥)o

最后code:

#include

#include

#include

#include

using namespace std;

const int S[14]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40};

int nums[5][21];

int score[5];

int i,j,k,m,n,heartcount,heartflag,sdcount;

char readc;

bool doubleflag;

void readInt(int &n){

while((readc=getchar())<48||readc>57);

n=readc-48;

while((readc=getchar())>=48&&readc<=57) n=n*10+readc-48;

}

void readcard(int &n){

while((readc=getchar())<48||readc>'z');

switch(readc){

case 'H':

n=1;

break;

case 'S':

n=2;

break;

case 'D':

n=3;

break;

case 'C':

n=4;

break;

}

while((readc=getchar())>=48&&readc<='z') n=n*10+readc-48;

if(n/100==0) {

int temp=n%10;

n/=10;

n*=100;

n+=temp;

}

}

int main(){

#ifndef ONLINE_JUDGE

freopen("heart.in","r",stdin);

freopen("heart.out","w",stdout);

#endif

while(true){

memset(score,0,sizeof(score));

memset(nums,0,sizeof(nums));

for(i=1;i<=4;i++){

readInt(nums[i][0]);

for(j=1;j<=nums[i][0];j++){

readcard(nums[i][j]);

}

}

if(nums[1][0]==0&&nums[2][0]==0&&nums[3][0]==0&&nums[4][0]==0) break;

heartflag=0;

for(i=1;i<=4;i++){

heartcount=0;

for(j=1;j<=nums[i][0];j++) if(nums[i][j]/100==1) heartcount++;

if(heartcount==13) {

heartflag=i;

break;

}else{

if(heartcount) break;

}

}

//judge if someone have all the hearts

sdcount=0;

for(i=1;i<=4;i++){

if(nums[i][0]==16) {

score[i]=1000;

continue;

}

doubleflag=false;

for(j=1;j<=nums[i][0];j++){

if(nums[i][j]==410) doubleflag=true; //search for doubelflag

}

if(heartflag!=i){

for(j=1;j<=nums[i][0];j++){

if(nums[i][j]/100==1) score[i]+=S[nums[i][j]%100];

if(nums[i][j]/100==2) score[i]-=100;

if(nums[i][j]/100==3) score[i]+=100;

}

//if hearts are in different people, count for the score

}else{

if(heartflag==i){

score[i]+=200;

for(j=1;j<=nums[i][0];j++){

if(nums[i][j]/100==2||nums[i][j]/100==3) sdcount++;

}

}

if(sdcount==2) score[i]+=500;

else{

for(j=1;j<=nums[i][0];j++){

if(nums[i][j]/100==2) score[i]-=100;

if(nums[i][j]/100==3) score[i]+=100;

}

}

//if all hearts are in the same people , count

}

if(doubleflag&&nums[i][0]==1){

score[i]+=50;

}else{

if(doubleflag)score[i]*=2;

}

//count for the double

}

for(i=1;i<=4;i++) if(score[i]>0) printf("+%d ",score[i]); else printf("%d ",score[i]);

putchar(10);

}

return 0;

}