• 蓝桥杯 牌型种数 DFS


    牌型种数

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

    请填写该整数,不要填写任何多余的内容或说明文字。


    思路:dfs //结果:3598180,比赛得到这么大的答案,也不敢填T^T

    相当于有13个桶,每个桶里面最大取4

    从第一个桶开始取,取值0~4,达到数目13,跳出,达不到,判断是否越界。未越界,那么就接着搜索,从下一桶开始艘。

    //有人来问,可能我解释的不太清楚,所以回来补充了QAQ

    一共是52张牌,不算花色的话就是13种类型,我用0~12来编号。然后0~12个桶里面每个桶都有4张花色不同的牌。程序从第0号桶开始搜索,当前没有选取牌,所以此时选出牌的数量就是0。dfs()函数中的参数pos代表当前搜索到哪个桶,cnt表示已经选取出来的牌数。先不考虑递归出口。跳过dfs中两个if判断。num取得是4和13-cnt中的小值。因为当前桶还没有选取最多有4张牌。但是需要注意的是,假如搜到当前位置时选出来的牌数已经达到了11张,而我们每人只能够拿走13张牌,所以当前位置我们最多只能再选取两张。一个是2,一个是4,很明显,当前桶可取的数量一定会选取较小的数值当作实际容量。再下一个for循环中我们需要做的就是确定当前桶中要拿走的数量,一张一张拿,再去搜下一个位置。当我们搜下一个位置时发现我们手中的牌已经达到了13张,那么祝贺你,已经搜寻到了一种可行方案,总方案数sum++,然后return。如果当前牌数没有到达13张,但是搜寻的位置到了13号桶,对不起我家没有那么多桶(注意程序中是从0开始编号的),此刻直接返回上一个位置和牌数,搜寻下一个可行方案。

    因为整个都是按找顺序搜寻的,桶的位置从0到12,手中的牌一张一张递增,所以不会出现重复的方案。要是还不明白,就线照着程序在纸上画一画就懂了。T^T。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int sum=0;
    void dfs(int pos, int cnt){
        if(cnt==13){
            sum++;
            return;
        }
        if(pos==13){
            return;
        }
        int num=min(13-cnt,4);//min取两者中的小值
        for(int i=0;i<=num;i++){
            dfs(pos+1,cnt+i);
        }
        return;
    }
    int main(){
        dfs(0,0);
        printf("%d
    ",sum);
        return 0;
    }
    


  • 相关阅读:
    搜索
    c++ map与unordered_map区别及使用
    01BFS
    宇智波程序笔记55-Flutter 混合开发】嵌入原生View-iOS
    宇智波程序笔记54-解Bug之路-记一次线上请求偶尔变慢的排查
    宇智波程序笔记53-从红黑树的本质出发,彻底理解红黑树!
    宇智波程序笔记52-最受欢迎的微服务框架概览
    宇智波程序笔记51-JDK 15安装及新特性介绍
    宇智波程序笔记50-解Bug之路-记一次线上请求偶尔变慢的排查
    宇智波程序笔记49-link JDBC Connector:Flink 与数据库集成最佳实践
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776009.html
Copyright © 2020-2023  润新知