第 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張...