Week6 限時大模擬 掌握魔法的東東2

2021-10-04 16:49:53 字數 2325 閱讀 1525

第 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))。

output

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

input  52

1031

output 08

00012

0360input254

00243

output00

02181656

64436432

113344

這其實是乙個子集列舉問題,在兩個元素已經確定的情況下,列舉所有元素個數為5的子集,並判斷型別。dfs+可行性剪枝。

結構體card儲存牌的大小和花色,排序方式為先按大小公升序,再按花色公升序。結構體陣列p存放被選中的五張牌,先判斷是否是1、2、3種型別並返回對應值。否則,剩下的幾種型別主要是相等的牌數不同,定義整型變數num表示五張牌中不同數字的個數,初值為5;tag為當前已經連續相等的牌數,初值為1(若比較的兩張牌不等則重置為1;max為五張牌中最大連續相等的牌數(if(tag>max)max=tag)。

if

(num==

5) 全不相等

if(num==

4) 一對

if(num==

3&&max==

2)兩對

if(num==

3&&max==

3)三條

if(num==

2&&max==

4)炸彈

if(num==

2&&max==

3)三代二

#include

#include

using

namespace std;

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

int chose[10]

=;// struct card

;bool

operator

<

(const card &c)

const};

card c[

100]

;//最多一百張牌

card p[5]

;//五張被選中的牌

void

judge

(card p)

}bool add=

true

;for

(int i=

0;i<

4;i++)}

if(same==

true

&&add==

true)if

(same)

if(add)

int num=5;

//5張牌中的不同數字 數

int max=

1,tag=1;

for(

int i=

0;i<

4;i++

)else}if

(num==5)

//全部不相等

if(num==4)

//有一對相等

if(num==

3&&max==2)

if(num==

3&&max==3)

if(num==

2&&max==4)

if(num==

2&&max==3)

}void

dfs(

int count,

int tag)

sort

(p1,p1+5)

;//排序

judge

(p1)

;return;}

for(

int i=tag;i

intmain()

}int count=2;

//初始牌數等於2

p[0].a=a1;p[0]

.b=b1;

p[1].a=a2;p[1]

.b=b2;

dfs(count,0)

;for

(int i=

1;i<=

9;i++

)return0;

}

week6 限時大模擬 掌握魔法的東東(簡單列舉)

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

Week(6) 限時大模擬

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

Week6 限時大模擬

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