F



i



v



e



-



gr



ea



t
蓝桥杯牌型种数(dfs)

牌型种数

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