题目描述:
小明被劫持到X赌城,被迫与其他3人玩牌。 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序
自己手里能拿到的初始牌型组合一共有多少种呢?
请输出该整数,不要输出任何多余的内容或说明文字。
题解:
方法一:暴力
最直观的就是根据牌的点数最小为1,最大为13,每张牌又有四种可能,即拿0-4张,创建若干个循环,因此我们可以遍历求解即可。
方法二:dfs
我们定义res存储种类个数,sum为我们手里所拿到的牌的个数,cur为目前拿过牌中最大的牌的点数大小。
代码:
#include <bits/stdc++.h>
using namespace std;
int res = 0;
int sum = 0;
void dfs(int cur)
{
if(sum>13)//牌数过多直接返回
return;
if(sum==13)//13张为一种方法,因此方法数加一
{
res++;
return;
}
if(cur==13)//点数过大,直接返回
{
return;
}
for(int i=0;i<=4;i++)//遍历下一个点数的牌拿几个
{
sum+=i;//先存储上我们开始拿的牌的个数
dfs(cur+1);//以此时拿的点数继续深搜
sum-=i;//回溯原先状态,因为上述dfs之后返回了若干种方法,即sum完成了它的宿命,
//此时需要将sum置换为没拿该牌时的状态,即深搜到底后开始广搜
}
}
int main()
{
dfs(0);//括号内为已经拿过的牌
cout<<res;
return 0;
}