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. 牌型种数