Test Message

b519: 撲克牌遊戲-商競103

內容

許多人常喜歡玩撲克牌,一副牌共有 52 張牌,有四種花色:黑桃、紅桃、方塊、和梅花。在撲克牌的玩法中,A 可作 1 點或 14 點,而 2-10 則為該牌之點數,另外 J、Q、K 分別為 11、12、13 點。在測試檔案中,每位玩家只會分到 5 張牌。下表將 52 張牌分別對應到數字 1~52,在測試檔案中,將以下表的數字代表某張牌。

點數
花色  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
紅桃 14 15 16 17 18 19 20 21 22 23 24 25 26
方塊 27 28 29 30 31 32 33 34 35 36 37 38 39
梅花 40 41 42 43 44 45 46 47 48 49 50 51 52

五張牌的相關的牌型如下:
「同花順」為同花色五張連續數字,相同花色的「順子」,得分 7 分;
「四條」為四張同數字的牌,外加任一單張的五張牌,得分 6 分;
「葫蘆」為三張同數字,另兩張同數字的牌;一個「一對」和「三條」所組成的五張牌;得分 5 分;
「順子」為五張數字連續的牌,數字各差1點的連續牌,從 A-2-3-4-5(1-2-3-4-5),到 10-J-Q-K-A(有 10-11-12-13-14,但沒有 J-Q-K-A-2),得分 4 分;
「三條」五張牌中包含三張同數字的牌,得分 3 分;
「兩對」五張牌中包含兩對兩同數字的牌,但不是四張相同數字的牌(非四條),得分 2 分;
「一對」五張牌中包含只有兩張同數字的牌,得分 1 分;
「雜牌」指不屬於以上任何一種組合,得分 0 分。
本題目的是判斷手上的五張牌是屬於以上那一種牌型,以得分代替牌型。


輸入

每個輸入資料含多個玩家取得的撲克牌資料,在檔案 in1.txt 和 in2.txt 中,每個玩家分別各使用一副牌,第 1 列的數字 n 代表有幾筆玩家資料要測試, ,第二列起為測試資料,之後每列為每筆的測試資料,代表每個玩家拿到的五張撲克牌,五張牌所代表的數間以空白隔開,而空白不限定一個。如上表所示,每張牌以一個數字(1~52)代表,例如:以 18 代表紅桃 5。

6
3 44 4 19 7
6 12 1 32 45
26 25 2 38 39
15 18 2 28 41
14 21 22 23 24
1 13 26 27 39

輸出

按照每個玩家手上的 5 張牌,判斷每個玩家手上的五張牌是那一種牌型;以得分代替牌型。

5 張牌的數字所對應到的牌型分別如下:
3 44 4 19 7 -> 順子;得分 4 分
6 12 1 32 45 -> 三條;得分 3 分
26 25 2 38 39 -> 兩對;得分 2 分
15 18 2 28 41 -> 四條;得分 6 分
14 21 22 23 24 -> 雜牌;得分 0 分
1 13 26 27 39 -> 葫蘆;得分 5 分

4
3
2
6
0
5


解題思路

先將數字分別除上和取於 13 得到該牌的花色和數字並記錄下來。

再來分成兩部分解,第一部分判斷對子類,也就數字有是重複的部分,如果有產生任一種對子(含三條葫蘆等) 就必定不會產生順子類,因為順子要 5 張都不同。

第二部分判斷順子類,如果上面沒有產生任何對子類,那就只可能是同花順、順子或雜牌,再進行一次判斷即可。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
int suit, num;
}Poker;

cmp(const Poker* lhs, const Poker* rhs)
{
return lhs->num - rhs->num;
}

int main()
{
Poker list[5];
int kase, tmp, count, s, n;
scanf(" %d", &kase);
while (kase--)
{
int pair[5] = { 0 };
for (int i = 0; i < 5; i++)
{
scanf(" %d", &tmp);
count = 1, tmp--;
list[i].suit = tmp / 13;
list[i].num = tmp % 13;
for (int j = i - 1; ~j; j--)
{
if (list[j].num == list[i].num)
count++;
}
pair[count]++, pair[count - 1]--;
}
if (pair[4]) puts("6");
else if (pair[3])
{
if (pair[2]) puts("5");
else puts("3");
}
else if (pair[2])
{
if (pair[2] == 2) puts("2");
else puts("1");
}
else
{
qsort(list, 5, sizeof(Poker), cmp);
s = n = 1;
for (int i = 1; i < 4; i++)
{
if (list[i].num - 1 != list[i - 1].num)
{
n = 0;
break;
}
if (list[i].suit != list[i - 1].suit)
s = 0;
}
if (n)
{
if (s) puts("7");
else puts("4");
}
else puts("0");
}
}
return 0;
}