小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
【分析】DFS+优化
注意题中条件:1°不考虑花色,不考虑手中牌的先后顺序,只考虑点数 2°每人13张牌,A~K 13种牌每种4张
因此,我们可通过DFS实现该过程,同时记录当前手中牌的数量cursum及最大牌号curno,且自己手中的牌按牌号递增排序(即只考虑13张牌依次增大的组合,而不需考虑其所有组合(如2 3 4三张牌,只考虑2 3 4组合而不考虑其他5种))
若初始牌型组合中拿到的同牌号的牌的数量在区间[0, 4]内,则符合要求,方案数+1。
#include <stdio.h>
int a[13]={4,4,4,4,4,4,4,4,4,4,4,4,4}; //牌A~K的初始数目
int ans=0; //方案总数
int ret[13]; //初始牌型组合(1~13 对应A~K)
//当前已拿牌数cursum 当前手中最大的牌编号curno
void dfs(int cursum,int curno)
{
int i;
if(cursum==13)
{
//打印符合要求的初始牌型组合
/*for(i=0;i<cursum;i++)
printf("%d ",ret[i]);
printf("\n");*/
ans++;
return;
}
//注意只考虑牌号依次增大的组合
for(i=curno;i<13;i++)
{
if(a[i]!=0)
{
a[i]--;
//ret[cursum]=i+1;
dfs(cursum+1,i);
a[i]++;
}
}
}
int main()
{
dfs(0,0);
printf("%d\n",ans);
return 0;
}