藍橋杯 牌型種數 (dfs)--------------------Five-菜鳥級
牌型種數
小明被劫持到X賭城,被迫與其他3人玩牌。
一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。
這時,小明腦子裡突然冒出一個問題:
如果不考慮花色,只考慮點數,也不考慮自己得到的牌的先後順序,自己手裡能拿到的初始牌型組合一共有多少種呢?
請填寫該整數,不要填寫任何多餘的內容或說明文字。
思路:比較簡單 用dfs 或則 13層for 迴圈 就好了
一共是52張牌,不算花色的話就是13種類型,我用0~12來編號。 就想著 所有牌按順序排好等你去取
0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 3 4 5 6 7 8 9 10 11 12
入口 (這裡開始,也就是第0層)
然後開始拿 牌 拿牌 無非就是 拿 或者不拿 如果拿 你想拿幾張。
當你在第num層的時候 你有 5 個選擇 拿0張 (不拿) 拿1張 拿2張 拿3張 拿4張
(當然這是在滿足一定條件下的,條件就是 你牌未拿滿13張 )
看程式碼吧 有解釋 這就是暴力的dfs 結果:3598180
#include<stdio.h>
int res=0;
void dfs(int num,int count){
// num 代表 取牌的數值 0~12 分別代表13張牌 count代表 你手中的牌
if(count>13||num>13)return;
//退出條件 你拿到的牌超過了13張 或則 你拿到的牌的數值超過了13
if(count==13) res++;//在滿足條件的情況下 拿到牌剛好13 張 算一種方案
else{
for(int i=0;i<=4;i++)
// 每一個數值的牌你取到的可能情況有 0(沒取這個數值的牌) 1(取了一張) 2 3 4
dfs(num+1,count+i);
// num+1 這種情況 考慮完了 考慮下個數值的牌 count+i 你手上多了 i 張 數值為 num的牌
}
}
int main()
{
dfs(0,0);// 剛開始 獲得了0張牌
printf("%d\n",res);
return 0;
}