撲克牌模擬

2021-10-04 12:03:50 字數 3649 閱讀 1106

題意:

東東有 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 種牌型的方案數(按牌型編號從小到大的順序)

輸入樣例:

25 4

0 0 24 3

輸出樣例:

0 0 0 2 18 1656 644 36432 113344

解題思路:

最多只有100種不同型別的撲克牌,完全可以列舉出來所有的型別,然後迴圈列舉所有的可能,在每一種條件下去判斷其所屬的種類即可。這裡為了方便我們寫乙個card結構體,然後先用雙重迴圈就可以把所有的撲克牌的種類列舉完全存在乙個單獨的card陣列當中。主要問題是在於判斷五張撲克牌組合的型別。我們寫乙個judge函式來返回五張撲克牌組合的型別。1、2、3這三種型別可以歸結為一類,用judge2和judge3函式來判斷,先求出五個撲克牌點數的最大和最小值,用對映mp來記錄每乙個點數的個數,只要點數相同就記在同乙個點數中。最多有4種花色,所以mp的最大值為4.如果最大值和最小值差4且每個種類的點數只有一種,則滿足型別2.如果花色全相同則滿足型別3,兩者均滿足就是型別1.剩下所有型別的判斷都可以用乙個函式judge456789來判斷。i_3、i_2分別記錄三個相同點數的牌與兩個相同點數的牌的種類數。依然是用mp對映來遍歷五張牌的點數統計出i_3、i_2的取值。然後根據i_3、i_2的取值就可以判斷出五張撲克牌組合的型別。

注意事項:

1、需要觀察到牌的種類很少,所以可以列舉出所有的撲克牌然後迴圈列舉出所有的組合種類。為了避免重複需要注意判斷列舉的牌不等於抽出的兩張牌,而且三個for迴圈的迴圈下表應該滿足:後乙個下標的初始值是前乙個下標加1.

2、在判斷後幾種組合型別時,一定注意去除重複,否則同乙個相同拍的組合的個數會被多次計算。因次,後面的撲克牌只有當點數不等於前面的撲克牌的點數時我們才做統計。

總結:

一道撲克牌的模擬問題,寫出card結構體會更便於後面的操作,本身難度不大,但有很多易錯點,比如多個需要去除重複的地方,也有不同的可以去重的方法。本來早早寫完**了,提交後就一直卡住了就沒管了,結果過了很久才發現wa了,原來card結構體的建構函式的賦值語句不小心寫反了乙個,粗心大意導致了錯誤。

參考**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int a,b,a1,b1,a2,b2;

int mycount[10]

;map<

int,

int> mp;

void

ini()}

struct card

bool

operator

!=(card &c)

} arr[

105]

;int

mymax

(int x1,

int x2,

int x3,

int x4,

int x5)

intmymin

(int x1,

int x2,

int x3,

int x4,

int x5)

bool

judge2

(card c1,card c2,card c3,card c4,card c5)

bool

judge3

(card c1,card c2,card c3,card c4,card c5)

intjudge456789

(card c1,card c2,card c3,card c4,card c5)

int i3=c3.a;

if(i3!=i1&&i3!=i2)

int i4=c4.a;

if(i4!=i1&&i4!=i2&&i4!=i3)

int i5=c5.a;

if(i5!=i1&&i5!=i2&&i5!=i3&&i5!=i4)

if(i_3==

1&&i_2==1)

return5;

if(i_2==2)

return6;

if(i_3==1)

return7;

if(i_2==1)

return8;

return9;

}int

judge

(card c1,card c2,card c3,card c4,card c5)

return

judge456789

(c1, c2, c3, c4, c5);}

intmain()

for(

int i=

0; i}}}}

}for

(int i=

1; i<=

9; i++

)return0;

}

撲克牌排序 tkinter模擬撲克牌和狼人殺發牌

今天我們用tkinter的canvas畫布實現撲克牌的隨機發牌 將54張牌隨機發給四位牌手,在螢幕上顯示每位牌手的牌,利用canvas將發牌結果顯示出來。需要準備的是54張撲克牌的 gif或者png,jpg的話要經過額外的轉換 為了保證最終的牌序是按照由小到大排列的,編號要按照aaaa 2222 k...

撲克牌排序 趣味撲克牌

一提到撲克牌,我們就想到神秘的魔術表演,撲克牌上有很多形狀和數字,裡面蘊藏了很多數學知識哦!瞧 subway的小朋友們正在進行趣味撲克牌的遊戲呢!好多撲克牌啊!撲克牌中間怎麼是空的呢?哇,還有這麼小的撲克牌呢!一看到teacher手中的撲克牌,小傢伙們乙個個的都興奮起來,迫不及待想要分享自己的見解呢...

程式模擬洗撲克牌(演算法)

前提 一副撲克牌有54張,因此我們可以乙個整型陣列array 54 或者map來儲存,a 用0 3,2 用4 7,3 用8 11.k 用48 51,小鬼用52,大鬼用53表示。關於花色,我們可以這樣表示 4i表示紅桃,4i 1表示黑桃,4i 2表示梅花,4i 3表示方塊 0 i 12 這樣的話,就退...