洛谷P1148 拱豬計分
洛谷P1148 拱豬計分
題意:
拱豬是一種很有趣的撲克牌遊戲。 即使你不知道它的玩法,你也可以由它的計分方式來了解它的趣味性。 假設在此我們僅考慮四個人的拱豬牌局,本題要求你根據下面的計分規則,在牌局結束時計算四位玩家所得分數。
-
我們分別以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 均在同一家,有下列情形︰
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 拱豬計分