遞迴進行多種牌型的選擇

2021-10-04 19:05:35 字數 2778 閱讀 3218

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

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

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

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

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

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

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

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

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

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

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

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

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

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

input

5 21 0 3 1

output

0 8 0 0 0 12 0 36 0

input

25 4

0 0 24 3

output

0 0 0 2 18 1656 644 36432 113344

本題與其說思路,不如說沒有思路,完全使用的暴力解法談論每種牌型。

如果說需要思路,那麼就是怎麼選接下來的三張牌。在這裡使用的是遞迴的方式,每張牌都可以有兩種情況——選或不選。這樣,就可以利用遞迴的方法,依次選擇取這張牌和不取兩種可能性。當取的牌數已經達到3時,需要對牌型進行相應的判斷,這裡面有幾種牌型是有包含巢狀的關係的。但主要還是通過if…else…的語句對相應的牌進行判斷。

#include

#include

using

namespace std;

struct node

;bool

cmp(

struct node x,

struct node y)

int a, b;

//輸入值

node m1[5]

;//記錄選擇的五張牌

int sum[9]

=;//9種牌型的方案數目

int x1,y1,x2,y2;

;bool vis[25]

[4]=

;int shuzu[

100]

;void

select

(int a1,

int b1,

int s)

if(s ==3||

(a1==a-

1&&b1==b-

1&&s==

2&&vis[a1]

[b1]

==false))

//如果前面已經選了3張或者已經選到了最後1張,則判斷牌型

//說明是同花順

else

//說明是普通順子

}else

//說明是同花

else

;int t =0;

for(j =

0; j <

4; j++)if

(t ==1)

//說明是炸彈

else

//說明是三帶二

}else

else

if(same !=

1&& m[j]

.a == m[j +1]

.a) same++

;else same=0;

}if(same ==2)

//說明是三條

else

//說明是兩對

}else

if(t ==3)

//說明是一對}}

}if(w ==

false

)//說明是要不起

return;}

m1[s +2]

.a = a1;

m1[s +2]

.b = b1;

if(vis[a1]

[b1]

==false

)//能選這個點

else

}else

}int

main()

藍橋杯歷屆真題 遞迴 牌型種數

小明被劫持到x賭城,被迫與其他3人玩牌。一副撲克牌 去掉大小王牌,共52張 均勻發給4個人,每個人13張。這時,小明腦子裡突然冒出乙個問題 如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?請填寫該整數,不要填寫任何多餘的內容或說明文字。答案 3...

鬥地主之用蟻群演算法整理牌型 如何進行牌力估計

我們在前面講到過,各牌手的牌力估計就是我們在用蟻群演算法構造最優牌型時的啟發性知識。啟發性知識其實就是我們利用自己的經驗對事物做出的判優性評估,或者說就是對事物價值的判斷。原則上,應用蟻群演算法需要用到兩類啟發性的知識 結構評分 單步最優未必全域性最優,所以當單只螞蟻圍繞每輪次的優勝解爬出乙個新解時...

多種選擇結構的形式

1.選擇結構概述 程式流程控制方式 順序結構 選擇結構 迴圈結構選擇結構概念 根據條件選擇執行的流程 分類 if 基本 if else 基本多重if if else if else if 巢狀if if else if 2.基本if選擇結構 語法 if boolean表示式 else 注意 bool...