(蓝桥杯第六届B组)牌型种数 dfs

本文介绍了一个使用深度优先搜索算法计算牌型组合的问题。通过递归地枚举每一种可能的点数数量,来计算出一副扑克牌去掉大小王后,四人游戏中每人拿到的13张牌的所有可能组合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

牌型种数

 

小明被劫持到X赌城,被迫与其他3人玩牌。

一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。

这时,小明脑子里突然冒出一个问题:

如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

 

请填写该整数,不要填写任何多余的内容或说明文字。


dfs直接搜索所有牌型

注意:

1.有13种数字牌,每种可以有01234个,不要忘记0
2.dfs完成后sum变回原数值


代码:

#include<iostream>
#include<stdlib.h>    
#include<stdio.h>    
#include<cmath>    
#include<algorithm>    
#include<string>    
#include<string.h>    
#include<set>    
#include<queue>    
#include<stack>    
#include<functional>     
using namespace std;

int sum = 0;//手中牌的总数
int ans = 0;//方案数

void dfs(int n) {//当前手中的牌数字
	if (sum > 13)
		return;
	if (n ==14) {//牌型搜索完毕
		if (sum == 13)//恰好有13张牌
			ans++;
		return;
	}
	else {
		for (int i = 0; i <= 4; i++) {
			sum += i;
			dfs(n + 1);//dfs下一个数字
			sum -= i;
		}
	}
}

int main() {
	dfs(1);
	cout << ans << endl;
	system("pause");
	return 0;
}


<think>好的,用户想查找第12届蓝桥杯C++ B的题目及解析。首先,我需要确认用户的具体需求是什么。他们可能需要完整的题目列表、题解,或者某些特定题目的解答。根据用户提供的引用资料,引用[4]提到了第十二届青少年蓝桥杯C++选拔赛真题解析,但用户可能误以为这是B的题目,实际上青少年可能与B不同,需要指出这一点。 接下来,我应该检查现有的引用内容。引用[1]、[2]、[3]分别提到了第十四届、第十四届和第十届的题目,而引用[4]是关于第十二届的选拔赛,但属于青少年,可能不是B的。因此,需要告知用户当前资料中没有第十二届C++ B的完整题目和解析,并提供可能的解决方案,比如建议用户查阅官方网站或联系主办方,或者参考其他届次的题目进行备考。 另外,用户可能希望得到相关问题的帮助,比如如何备考或优化代码。根据引用[1]提到的蓝桥杯趋势逐渐转向DP和搜索图论,可以建议用户重点复习这些领域。同时,引用[4]中的解析方法,比如题目分析、算法分析、循环和条件判断的使用,可以作为备考建议的一部分。 最后,确保回答结构清晰,分点说明,并附上相关问题,帮助用户进一步思考。需要确认所有数学公式和代码块符合格式要求,使用中文回答,并正确添加引用标识。</think>根据现有引用资料,未发现第十二届蓝桥杯C++ B完整真题及解析的直接记录。但根据引用[4]提供的线索,第十二届青少年选拔赛题目解析中涉及以下关键考点: 1. **算法设计**:需掌握基础算法如$O(n^2)$暴力枚举,如试题中的两两比较求最值 2. **编程基础**:要求熟练使用循环结构(如`for`循环)、条件判断(`if`语句)和输入输出流操作[^4] 3. **复杂度控制**:在比赛得分类题目中,需注意$n^2$时间复杂度可能带来的性能问题 $$ \text{最值计算公式}:\quad \max_{1 \leq i,j \leq n} |a_i - a_j| $$ **建议备考方法**: 1. 强化动态规划训练(如引用[1]提到的趋势) 2. 重点练习图论搜索算法(DFS/BFS) 3. 掌握常用数学公式推导,如快速幂、合数计算等 ```cpp // 示例:两数绝对值差最大值计算 #include <iostream> #include <algorithm> using namespace std; int main() { int n, max_diff = 0; cin >> n; int arr[n]; for(int i=0; i<n; i++) cin >> arr[i]; for(int i=0; i<n; i++) for(int j=0; j<n; j++) max_diff = max(max_diff, abs(arr[i]-arr[j])); cout << max_diff; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值