·【蓝桥】·牌型种数

一道绝妙的递归题目,看完答案后的第一感受是,你根本不懂递归!
题目链接:·【蓝桥】·牌型种数

题目描述
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。

题目分析

  • 题意很简单,52张取13张,只考虑数字,有多少种组合
  • 如果构建一颗Dfs的树,取13次,深度就是13,对于每层的抽牌,如何筛选,成为了解题的关键

算法思想

  • 换一种思路,52张牌可分为13种,每种最多可选的次数为4
  • 只需将13种牌分配完即可(这样树的深度同样为13),每种牌所分配的选择为0、1、2、3、4
  • 于是在递归过程中,k(k≤13)控制树的深度;
    cnt(cnt≤13)控制所选的牌的个数,每一层递归cnt可增加的选择为0、1、2、3、4

==递归大法好!==

———————越是美妙的算法代码量越小———————

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <algorithm>

using namespace std;

int ans = 0;
void dfs(int k, int cnt){
if(k>13 || cnt>13)
return;
if(k==13 && cnt==13){
ans++;
return;
}
for(int i = 0; i <= 4; ++i){
dfs(k+1, cnt+i);
}
}
int main(){
dfs(0, 0);
cout << ans << endl;
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!