牌型种数
小明被劫持到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;
}