WEEK9 作業 B 東東學打牌

2021-10-05 05:00:41 字數 3869 閱讀 5060

最近,東東沉迷於打牌。所以他找到 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 張牌不同,其值不同。下面依次列舉了這手牌的形成規則:

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

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

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

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

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

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

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

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

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

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

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

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

對於每組測試資料,輸出 n 行,即這次全場人的排名。

3

dongdong aaa109

zjm 678910

hrz 678910

hrz

zjmdongdong

結構體peop代表每個人和他手中的牌,根據題意,先比牌型,牌型相同則根據各牌型的規則比大小,牌完全相同比名字。所以這個結構體裡有名字name,x代表牌型,y、z、w代表牌型裡面的大小,比如兩對這個牌型,y代表大的對子的大小,z代表小的對子的大小,w代表單個牌的大小。若其他牌型用不上這麼多變數,則多餘變數置0,比如龍順時,x為8,y、z、w全為0。

一開始輸入的時候呼叫cont()函式,算出牌型,把名字和代表牌型的數字變成結構體。所有插入完成後,用sort函式排序,然後依次輸出peop陣列中的名字即可。

注意不能連續使用等號(a= =b= =c),只能(a= =b&&b= =c),上次已經出錯一次了,這次一開始還是寫錯了。

注意在呼叫函式時,不要把int*與int 混淆。

不知道為什麼,對peop結構體排序時,使用結構體內過載《的方法 ,編譯出錯;使用重寫cmp()函式的方法,編譯通過。

#define _crt_secure_no_warnings 1

#include #include #include #include #include #include using namespace std;

char card[13] = ;

struct peop

peop(string nam, int a, int b, int c, int d)

};peop p[100010];

bool cmp(const peop& a, const peop& b)

}else

} else

} else

}bool shunzi(int sz, int* a)

return 0;

}bool longshun(int sz, int* a)

return 0;

}bool zhadan(int sz, int* a)

if (sz[4] == sz[1] && sz[1] == sz[2] && sz[1] == sz[3])

return 0;

}bool sandaier(int sz, int* a)

if (sz[0] == sz[1] && sz[2] == sz[3] && sz[2] == sz[4])

return 0;

}bool sange(int sz, int* a)

if (sz[3] == sz[1] && sz[1] == sz[2])

if (sz[3] == sz[4] && sz[3] == sz[2])

return 0;

}bool liangdui(int sz, int* a)

else

return 1;

} if (sz[1] == sz[2] && sz[3] == sz[4])

else

return 1;

} if (sz[0] == sz[1] && sz[3] == sz[4])

else

return 1;

} return 0;

}bool duizi(int sz, int* a)

if (sz[1] == sz[2])

if (sz[2] == sz[3])

if (sz[3] == sz[4])

return 0;

}bool dapai(int sz, int* a)

int* cont(int sz)

if (longshun(sz, a))

if (zhadan(sz, a))

if (sandaier(sz, a))

if (sange(sz, a))

if (liangdui(sz, a))

if (duizi(sz, a))

dapai(sz, a);

//cout<> nam;

//printf("%s\n",nam);

for (int j = 0; j < 5; j++) //把0拿進來

sz[j] = k; break;

}//cout<<"牌大小:"<}//檢查每張牌等於幾

}//輸入5張牌

int* a = cont(sz);

p[i].name = nam;

p[i].x = a[0]; p[i].y = a[1];

p[i].z = a[2]; p[i].w = a[3];

}//輸入n個人和他們的牌

sort(p, p + n,cmp);

for (int i = 0; i < n; i++)

return 0;

}

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...