首页 > 其他 > 详细

洛谷P1148 拱猪计分

时间:2018-09-23 00:45:11      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:color   str   als   false   ()   原则   分数   例如   代码   

洛谷P1148 拱猪计分

题意:

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

  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 均在同一家,有下列情形︰

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

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

o 而 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

代码:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 using namespace std;
  6 const int S[14]={0,-50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40};
  7 int nums[5][21];
  8 int score[5];
  9 int i,j,k,m,n,heartcount,heartflag,sdcount;
 10 char readc;
 11 bool doubleflag;
 12 void readInt(int &n){
 13     while((readc=getchar())<48||readc>57);
 14     n=readc-48;
 15     while((readc=getchar())>=48&&readc<=57) n=n*10+readc-48;
 16 }
 17 void readcard(int &n){
 18     while((readc=getchar())<48||readc>z);
 19     switch(readc){
 20         case H:
 21             n=1;
 22             break;
 23         case S:
 24             n=2;
 25             break;
 26         case D:
 27             n=3;
 28             break;
 29         case C:
 30             n=4;
 31             break;
 32     }
 33     while((readc=getchar())>=48&&readc<=z) n=n*10+readc-48;
 34     if(n/100==0) {
 35         int temp=n%10;
 36         n/=10;
 37         n*=100;
 38         n+=temp;
 39     }
 40 }
 41 int main(){
 42 #ifndef ONLINE_JUDGE
 43     freopen("heart.in","r",stdin);
 44     freopen("heart.out","w",stdout);
 45 #endif
 46     while(true){
 47         memset(score,0,sizeof(score));
 48         memset(nums,0,sizeof(nums));
 49         for(i=1;i<=4;i++){
 50             readInt(nums[i][0]);
 51             for(j=1;j<=nums[i][0];j++){
 52                 readcard(nums[i][j]);
 53             }
 54         }
 55         if(nums[1][0]==0&&nums[2][0]==0&&nums[3][0]==0&&nums[4][0]==0) break;
 56         heartflag=0;
 57         for(i=1;i<=4;i++){
 58             heartcount=0;
 59             for(j=1;j<=nums[i][0];j++) if(nums[i][j]/100==1) heartcount++;
 60             if(heartcount==13) {
 61                 heartflag=i;
 62                 break;
 63             }else{
 64                 if(heartcount) break;
 65             }
 66         }
 67         //judge if someone have all the hearts
 68         sdcount=0;
 69         for(i=1;i<=4;i++){
 70             if(nums[i][0]==16) {
 71                 score[i]=1000;
 72                 continue;
 73             }
 74             doubleflag=false;
 75             for(j=1;j<=nums[i][0];j++){
 76                 if(nums[i][j]==410) doubleflag=true; //search for doubelflag
 77             }
 78             if(heartflag!=i){
 79                 for(j=1;j<=nums[i][0];j++){
 80                     if(nums[i][j]/100==1) score[i]+=S[nums[i][j]%100];
 81                     if(nums[i][j]/100==2) score[i]-=100;
 82                     if(nums[i][j]/100==3) score[i]+=100;
 83                 }
 84                 //if hearts are in different people, count for the score
 85             }else{
 86                 if(heartflag==i){
 87                     score[i]+=200;
 88                     for(j=1;j<=nums[i][0];j++){
 89                         if(nums[i][j]/100==2||nums[i][j]/100==3) sdcount++;
 90                     }
 91                 }
 92                 if(sdcount==2) score[i]+=500;
 93                 else{
 94                     for(j=1;j<=nums[i][0];j++){
 95                         if(nums[i][j]/100==2) score[i]-=100;
 96                         if(nums[i][j]/100==3) score[i]+=100;
 97                     }
 98                 }
 99                 //if all hearts are in the same people , count
100             }
101             if(doubleflag&&nums[i][0]==1){
102                 score[i]+=50;
103             }else{
104                 if(doubleflag)score[i]*=2;
105             }
106             //count for the double
107         }
108         for(i=1;i<=4;i++) if(score[i]>0) printf("+%d ",score[i]); else printf("%d ",score[i]);
109         putchar(10);
110     }
111     return 0;
112 }
113 /*
114 4  S12  H3  H5  H13
115 3  D11  H8  H9
116 6  C10  H1  H2  H4  H6  H7
117 3  H10  H11 H12
118 13 H1  H2  H3  H4  H5  H6  H7  H8  H9  H10  H11  H12  H13  
119 2  S12  C10
120 1  D11
121 0
122 0
123 0
124 0
125 0
126 
127 */

 

洛谷P1148 拱猪计分

标签:color   str   als   false   ()   原则   分数   例如   代码   

原文:https://www.cnblogs.com/linxif2008/p/9691689.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号