题目:
小明被劫持到 X 赌城,被迫与其他 3 人玩牌。
一副扑克牌(去掉大小王牌,共 52 张),均匀发给 4 个人,每个人 13 张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
想法: (也是参考别人的博客之后才...不过这种思想还是要有的,然后就造了一遍轮子)
题目一共52张牌,不分花色,即每种牌(A,1,2,3...J,Q,K)有四张,最后从中拿取13张的可能组合牌型。这个题要抽象化,就是每种牌有5种方式拿取,
即一张也没有拿到,拿到1张,拿到2张,拿到3张,拿到4张,五种可能。然后通过DFS来穷举每一种可能(就像搜索迷宫一样),即拿到13张牌就算一种牌型,进行累加便可。
当然拿牌张数大于等于13就是边界了。
注意:深搜时要控制好每次都会选择一张也没拿的情况,也就是0
参考代码:
#include <iostream> #include <cstdio> using namespace std; long long ans; // cnt 计算已经拿取的张数 // k就是控制递归时,控制一直取0(也就是不拿)的情况 void dfs(int cnt, int k) { if (cnt == 13) ans++; if (cnt >= 13 || k >= 13) return; for (int i = 0; i <= 4; i++) dfs(cnt+i, k+1); } int main( ) { ans = 0; // 初始化张数为0,拿的次数初始为0 dfs(0, 0); cout << ans << endl; return 0; }
有不对的请多包涵