《程式設計思維與實踐》 week6 限時大模擬

2021-10-23 02:07:54 字數 3841 閱讀 3015

從瑞神家打牌回來後,東東痛定思痛,決定苦練牌技,終成賭神!

東東有 a × b 張撲克牌。每張撲克牌有乙個大小(整數,記為a,範圍區間是 0 到 a - 1)和乙個花色(整數,記為b,範圍區間是 0 到 b - 1。

撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。

「一手牌」的意思是你手裡有5張不同的牌,這 5 張牌沒有誰在前誰在後的順序之分,它們可以形成乙個牌型。 我們定義了 9 種牌型,如下是 9 種牌型的規則,我們用「低序號優先」來匹配牌型,即這「一手牌」從上到下滿足的第乙個牌型規則就是它的「牌型編號」(乙個整數,屬於1到9):

1、同花順: 同時滿足規則 2 和規則 3.

2、順子 : 5張牌的大小形如 x, x + 1, x + 2, x + 3, x + 4

3、同花 : 5張牌都是相同花色的.

4、炸彈 : 5張牌其中有4張牌的大小相等.

5、三帶二 : 5張牌其中有3張牌的大小相等,且另外2張牌的大小也相等.

6、兩對: 5張牌其中有2張牌的大小相等,且另外3張牌中2張牌的大小相等.

7、三條: 5張牌其中有3張牌的大小相等.

8、一對: 5張牌其中有2張牌的大小相等.

9、要不起: 這手牌不滿足上述的牌型中任意乙個.

現在, 東東從a × b 張撲克牌中拿走了 2 張牌!分別是 (a1, b1) 和 (a2, b2). (其中a表示大小,b表示花色)

現在要從剩下的撲克牌中再隨機拿出 3 張!組成一手牌!!

其實東東除了會打**,他業餘還是乙個魔法師,現在他要預言他的未來的可能性,即他將拿到的「一手牌」的可能性,我們用乙個「牌型編號(乙個整數,屬於1到9)」來表示這手牌的牌型,那麼他的未來有 9 種可能,但每種可能的方案數不一樣。

現在,東東的阿戈摩托之眼沒了,你需要幫他算一算 9 種牌型中,每種牌型的方案數。

第 1 行包含了整數 a 和 b (5 ≤ a ≤ 25, 1 ≤ b ≤ 4).

第 2 行包含了整數 a1, b1, a2, b2 (0 ≤ a1, a2 ≤ a - 1, 0 ≤ b1, b2 ≤ b - 1, (a1, b1) ≠ (a2, b2)).

輸出一行,這行有 9 個整數,每個整數代表了 9 種牌型的方案數(按牌型編號從小到大的順序)

2540

0243

000

2181656

64436432

113344

開始沒有注意到撲克牌的最大數量為100,以為暴力列舉會超時,選擇了排列組合,結果排列組合也沒整明白,最後不了了之。。。

暴力列舉特點就是比較清楚展示了整個判斷的過程,下面是具體分析

結構體pai包含兩個屬性:牌值 和 花色

用乙個型別為pai的vector陣列vector< pai > all儲存下來所有的撲克牌,其大小應該為a * b;

手牌一共是五張,用乙個pai型別的陣列hand [5]儲存所有的手牌,然後輸入規定好的手牌的第一和第二張,剩下的就是從all陣列裡面選擇牌王手牌陣列裡面進行新增;每次進行新增的時候都要進行一次判斷,要插入手牌陣列的牌不能與規定好的第

一、二張手牌一樣;

判斷牌型編號:

a表示的是牌值的範圍,可以用乙個大小為25的陣列儲存牌值出現的次數,有幾張對應數值的牌,對應位置陣列的值就加一;

b表示的是花色的範圍,可以用乙個大小為5的陣列儲存花色出現的次數,原理同上;

對於一共五張牌的手牌,且花色b的範圍是小於等於4的,那麼同一種牌值出現的次數只能是小於等於4的,用乙個大小為5的陣列儲存對應次數的元素出現的個數;個數 / 次數 = 對數

接下來就是根據題目中對於牌型編號的描述一一對應的寫出判斷條件,這都比較簡單;

特別地,要注意的是,題目中描述到 這「一手牌」從上到下滿足的第乙個牌型規則就是它的「牌型編號」,那麼當這種手牌對應到了9種判斷條件中的第乙個之後就直接return,退出判斷函式,否則就會導致結果數量比目標答案多。

#include

#include

#include

#include

#include

using

namespace std;

long

long

int type[10]

;int count_zhi[26]

;int count_hua[5]

;int count_number[5]

;int a, b;

struct pai

pai(

int a,

int b)

bool

operator

!=(pai &x)

bool

operator

<

(pai &x)};

vector all;

pai hand[5]

;void judge (pai hand)

for(

int a =

0; a <

5; a++

) count_number[count_zhi[hand[a]

.zhi]]++

;int max_zhi =

max(hand[0]

.zhi,

max(hand[1]

.zhi,

max(hand[2]

.zhi,

max(hand[3]

.zhi, hand[4]

.zhi)))

);int min_zhi =

min(hand[0]

.zhi,

min(hand[1]

.zhi,

min(hand[2]

.zhi,

min(hand[3]

.zhi, hand[4]

.zhi)))

);//同花順

if(count_hua[hand[0]

.hua]==5

&& max_zhi - min_zhi ==

4&& count_number[1]

==5)//順子

if(max_zhi - min_zhi ==

4&& count_number[1]

==5)//同花

if(count_hua[hand[0]

.hua]==5

)//炸彈

if(count_number[4]

==4)//三帶二

if(count_number[3]

==3&& count_number[2]

==2)//兩對

if(count_number[2]

==4)//三條

if(count_number[3]

==3)//一對

if(count_number[2]

==2)//要不起

else

}int

main()

}//起始的兩張牌

for(

int x =

0; x <

2; x++

)for

(int x =

0; x <

10; x++

) type[x]=0

;//對所有牌進行列舉

for(

long

int x =

0; x < all.

size()

; x++)}

}}}}

//輸出結果

for(

int x =

1; x <=

9; x++

)return0;

}

程式設計思維與實踐 Week6 限時大模擬

從瑞神家打牌回來後,東東痛定思痛,決定苦練牌技,終成賭神!東東有 a b 張撲克牌。每張撲克牌有乙個大小 整數,記為a,範圍區間是 0 到 a 1 和乙個花色 整數,記為b,範圍區間是 0 到 b 1。撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。一手牌 的意思是你手裡有5張...

程式設計思維與實踐 Week6 限時大模擬

從瑞神家打牌回來後,東東痛定思痛,決定苦練牌技,終成賭神!東東有 a b 張撲克牌。每張撲克牌有乙個大小 整數,記為a,範圍區間是 0 到 a 1 和乙個花色 整數,記為b,範圍區間是 0 到 b 1。撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。一手牌 的意思是你手裡有5張...

程式設計思維與實踐 Week6 限時模擬

idea codes 從瑞神家打牌回來後,東東痛定思痛,決定苦練牌技,終成賭神!東東有 a b 張撲克牌。每張撲克牌有乙個大小 整數,記為a,範圍區間是0到a 1 和乙個花色 整數,記為b,範圍區間是 0 到 b 1。撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。一手牌 的意...