LQ0013 牌型种数DFS

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0013 牌型种数DFS相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2015初赛 C++ A组D题

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

输出格式
请输出该整数,不要输出任何多余的内容或说明文字。

问题分析
用dfs(深度优先搜索)来计算组合数。
不考虑花色只考虑点数,那么可以把点数相同的牌放在同一堆里,共13堆。
从某一堆里拿牌,可以拿0-4张某点数的牌,即每一点数的牌有5种取法。
拿够13张即得到一种拿法,做个计数。
拿到的张数超过13,或点数超过13,都需要做剪枝。
程序运行输出结果是3598180。

AC的C语言程序如下:

/* LQ0013 牌型种数 */

#include <stdio.h>
#include <string.h>

int vis[13 + 1];
int cnt;

/* n表示点数,k表示目前已经拿到的张数 */
void dfs(int n, int k)

    if (k > 13) return;
    else if (k == 13) 
        cnt++;
        return;
    

    if (n > 13) return;
    else 
        if (!vis[n]) 
            vis[n] = 1;
            /* 从点数n的那一堆拿牌,每一堆里可以拿0-4张 */
            for (int i = 0; i <= 4; i++)
                dfs(n + 1, k + i);
            vis[n] = 0;
        
    


int main()

    memset(vis, 0, sizeof vis);
    cnt = 0;

    /* 从点数1的牌堆开始拿牌, 目前拿到的张数是0 */
    dfs(1, 0);

    printf("%d\\n", cnt);

    return 0;

以上是关于LQ0013 牌型种数DFS的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯历届试题:牌型种数

2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - G. 牌型种数

斗地主基本牌型判断

蓝桥杯第六届-牌型总数&&蓝桥杯第七届-凑算式&&蓝桥杯第七届-方格填数

2022 华为机试真题 C++ 实现 德州扑克

#30. 斗地主(T1-9)