1. 程式人生 > >洛谷P1148 拱豬計分

洛谷P1148 拱豬計分

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 拱豬計分