2015蓝桥杯A组C/C++第4题 【牌型种数】---dfs

题目描述:

小明被劫持到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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值