Week9作業 B 東東學打牌 模擬

2021-10-05 06:49:32 字數 4242 閱讀 7245

最近,東東沉迷於打牌。所以他找到 hrz、zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則:

所有撲克牌只按數字來算大小,忽略花色。

每張撲克牌的大小由乙個值表示。a, 2, 3, 4, 5, 6, 7, 8, 9, 10, j, q, k 分別指代 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。

每個玩家抽得 5 張撲克牌,組成一手牌!(每種撲克牌的張數是無限的,你不用擔心,東東家裡有無數副撲克牌)

理所當然地,一手牌是有不同型別,並且有大小之分的。

舉個栗子,現在東東的 「一手牌」(記為 α),瑞神的 「一手牌」(記為 β),要麼 α > β,要麼 α < β,要麼 α = β。

那麼這兩個 「一手牌」,如何進行比較大小呢?首先對於不同型別的一手牌,其值的大小即下面的標號;對於同型別的一手牌,根據組成這手牌的 5 張牌不同,其值不同。下面依次列舉了這手牌的形成規則:

1.大牌:這手牌不符合下面任乙個形成規則。如果 α 和 β 都是大牌,那麼定義它們的大小為組成這手牌的 5 張牌的大小總和。

2.對子:5 張牌中有 2 張牌的值相等。如果 α 和 β 都是對子,比較這個 「對子」 的大小,如果 α 和 β 的 「對子」 大小相等,那麼比較剩下 3 張牌的總和。

3.兩對:5 張牌中有兩個不同的對子。如果 α 和 β 都是兩對,先比較雙方較大的那個對子,如果相等,再比較雙方較小的那個對子,如果還相等,只能比較 5 張牌中的最後那張牌組不成對子的牌。

4.三個:5 張牌中有 3 張牌的值相等。如果 α 和 β 都是 「三個」,比較這個 「三個」 的大小,如果 α 和 β 的 「三個」 大小相等,那麼比較剩下 2 張牌的總和。

5.三帶二:5 張牌中有 3 張牌的值相等,另外 2 張牌值也相等。如果 α 和 β 都是 「三帶二」,先比較它們的 「三個」 的大小,如果相等,再比較 「對子」 的大小。

6.炸彈:5 張牌中有 4 張牌的值相等。如果 α 和 β 都是 「炸彈」,比較 「炸彈」 的大小,如果相等,比較剩下那張牌的大小。

7.順子:5 張牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 「順子」,直接比較兩個順子的最大值。

8.龍順:5 張牌分別為 10、j、q、k、a。

作為乙個稱職的魔法師,東東得知了全場人手裡 5 張牌的情況。他現在要輸出乙個排行榜。排行榜按照選手們的 「一手牌」 大小進行排序,如果兩個選手的牌相等,那麼人名字典序小的排在前面。

不料,此時一束宇宙射線掃過,為了躲避宇宙射線,東東慌亂中清空了他腦中的 cache。請你告訴東東,全場人的排名。

輸入包含多組資料。每組輸入開頭乙個整數 n (1 <= n <= 1e5),表明全場共多少人。

隨後是 n 行,每行乙個字串 s1 和 s2 (1 <= |s1|,|s2| <= 10), s1 是對應人的名字,s2 是他手裡的牌情況。

首先要將讀入的牌的字串進行處理,將字串轉換為5張牌的int值。依次判斷字串的每一位,2-9就是數字2-9,1就是數字10且字串下一位要略過,字母ajqk就是1,11,12,13。

用struct player:string name,int pai[5]來儲存玩家資訊。將牌的字串轉換為int pai[5]後要進行公升序排序,便於之後求手牌大小。

int value(int p[5],int a[3])用於求p[5]手牌大小,函式值返回手牌的大小1~8,a[3]返回值相同時比較要用的資訊。根據題目所給資訊依次寫出8種手牌情況。(龍順不是9 10 11 12 13而是1 10 11 12 13)

然後寫player p1一道模擬題,相對於目錄模擬器來說稍微簡單一些,因為沒有時間複雜度的限制,只要根據題目所給資訊一點點細心寫下來就行。不過這也很考驗細心與耐心,只要有一點點錯,就要花億點點時間來debug。

#include

#include

#include

using

namespace std;

int n;

struct player

;player node[

100100];

void

solve

(int pai[5]

,string s)

//將字串s轉換為5張牌

else

if(s[i]

=='a'

) pai[index]=1

;else

if(s[i]

=='j'

) pai[index]=11

;else

if(s[i]

=='q'

) pai[index]=12

;else

if(s[i]

=='k'

) pai[index]=13

; index++;}

}int

value

(int p[5]

,int a[3]

)//5張牌返回手牌大小,a返回比較時要用的資訊

else

if(p[0]

==p[1]

&&p[1]

==p[2]

&&p[2]

==p[3]

)//6炸彈 41分布

else

if(p[1]

==p[2]

&&p[2]

==p[3]

&&p[3]

==p[4]

)//6炸彈 14分布

else

if(p[0]

==p[1]

&&p[1]

==p[2]

&&p[3]

==p[4]

)//5三帶二 32分布

else

if(p[0]

==p[1]

&&p[2]

==p[3]

&&p[3]

==p[4]

)//5三帶二 23分布

else

if(p[0]

==p[1]

&&p[1]

==p[2]

)//4三個 311分布

else

if(p[1]

==p[2]

&&p[2]

==p[3]

)//4三個 131分布

else

if(p[2]

==p[3]

&&p[3]

==p[4]

)//4三個 113分布

else

if(p[0]

==p[1]

&&p[2]

==p[3]

)//3兩對 221分布

else

if(p[0]

==p[1]

&&p[3]

==p[4]

)//3兩對 212分布

else

if(p[1]

==p[2]

&&p[3]

==p[4]

)//3兩對 122分布

else

if(p[0]

==p[1]

)//2對子 2111分布

else

if(p[1]

==p[2]

)//2對子 1211分布

else

if(p[2]

==p[3]

)//2對子 1121分布

else

if(p[3]

==p[4]

)//2對子 1112分布

else

//1大牌

}bool

cmp(player &p1,player &p2)

//比較,返回p1

else

if(value1==

6||value1==

5||value1==

4||value1==2)

//炸彈三帶二三個對子 比較a[0]和a[1]

else

if(value1==3)

//兩對 比較大對a[0]小對a[1]和剩餘a[2]

//手牌值相等,名字字典序大的排在後面(即值更小)

return p1.name>p2.name ?

true

:false;}

}int

main()

sort

(node,node+n,cmp)

;//公升序排序

for(

int i=n-

1;i>=

0;i--

) cout<.name<}}

WEEK9 作業 B 東東學打牌

最近,東東沉迷於打牌。所以他找到 hrz zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則 所有撲克牌只按數字來算大小,忽略花色。每張撲克牌的大小由乙個值表示。a,2,3,4,5,6,7,8,9,10,j,q,k 分別指代 1,2,3,4,5,6,7,8,9,10,11,12,13...

程式設計Week9 作業 B 東東學打牌

最近,東東沉迷於打牌。所以他找到 hrz zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則 所有撲克牌只按數字來算大小,忽略花色。每張撲克牌的大小由乙個值表示。a,2,3,4,5,6,7,8,9,10,j,q,k 分別指代 1,2,3,4,5,6,7,8,9,10,11,12,13...

東東學打牌 Week9作業B題

最近,東東沉迷於打牌。所以他找到 hrz zjm 等人和他一起打牌。由於人數眾多,東東稍微修改了億下遊戲規則 所有撲克牌只按數字來算大小,忽略花色。每張撲克牌的大小由乙個值表示。a,2,3,4,5,6,7,8,9,10,j,q,k 分別指代 1,2,3,4,5,6,7,8,9,10,11,12,13...