蓝桥杯 牌型种数 (暴力||dfs)

本文探讨了一副扑克牌中,不考虑花色和发牌顺序的情况下,手中持有13张牌的所有可能组合数量。通过使用暴力法和深度优先搜索算法(DFS)两种方法实现了计算,并给出了最终的答案为3598180种。

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

牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
思路:循环遍历每个点数所选择的张数,每个点数最多可以选4张,最少可以选0张即不选,每当牌总数达到13张则计数。


答案:3598180



暴力法:

#include <iostream>
using namespace std;
int main()
{
    int sum=0;
    for(int a=0; a<=4; a++)
        for(int b=0; b<=4; b++)
            for(int c=0; c<=4; c++)
                for(int d=0; d<=4; d++)
                    for(int e=0; e<=4; e++)
                        for(int f=0; f<=4; f++)
                            for(int g=0; g<=4; g++)
                                for(int h=0; h<=4; h++)
                                    for(int i=0; i<=4; i++)
                                        for(int j=0; j<=4; j++)
                                            for(int k=0; k<=4; k++)
                                                for(int l=0; l<=4; l++)
                                                    for(int m=0; m<=4; m++)
                                                    {
                                                        if(a+b+c+d+e+f+g+h+i+j+k+l+m==13)
                                                            sum++;
                                                    }
                                                    cout<<sum<<endl;
    return 0;
}


dfs:

dfs的深度是牌的类型,每种牌可以选0~4种,选的牌的总数相加==13.....

#include<bits/stdc++.h>
using namespace std;
int ans=0;

void dfs(int type,int sum)
{
	if(sum>13) return;
	if(type==13) {
		if(sum==13) ans++;
		return;
	}
	for(int i=0;i<5;i++) {
		dfs(type+1,sum+i);
	}
}
 
int main()
{
	dfs(0,0);
	cout<<ans<<endl;
}




### 蓝桥杯 Python DFS 暴力解法 练习题及资源 #### 关于蓝桥杯中的DFS暴力解法 在蓝桥杯竞赛中,深度优先搜索(Depth First Search, DFS)是一种常见的算法应用方式。它通常用于解决组合问题、路径探索以及枚举所有可能的情况等问题[^1]。通过使用DFS暴力解法,可以有效地遍历所有的可能性并找到满足条件的结果。 以下是针对Python实现DFS暴力解法的相关练习方法和推荐资源: --- #### 推荐练习题 以下是一些适合初学者到中级选手使用的DFS暴力解法题目,这些题目来源于历年蓝桥杯真题和其他经典编程平台上的训练题集[^2]。 1. **基础入门** - **题目描述**: 找出给定数组的所有子序列。 ```python def dfs_subsequences(nums, path, result): if not nums: result.append(path[:]) return # 不选当前数 dfs_subsequences(nums[1:], path, result) # 选当前数 path.append(nums[0]) dfs_subsequences(nums[1:], path, result) path.pop() nums = [1, 2, 3] result = [] dfs_subsequences(nums, [], result) print(result) # 输出所有子序列 ``` 2. **进阶提升** - **题目描述**: 使用DFS求解N皇后问题。 ```python def solve_n_queens(n): col = set() pos_diag = set() # (r + c) neg_diag = set() # (r - c) res = [] board = [["."] * n for _ in range(n)] def backtrack(r): if r == n: copy = ["".join(row) for row in board] res.append(copy) return for c in range(n): if c in col or (r + c) in pos_diag or (r - c) in neg_diag: continue col.add(c) pos_diag.add(r + c) neg_diag.add(r - c) board[r][c] = "Q" backtrack(r + 1) col.remove(c) pos_diag.remove(r + c) neg_diag.remove(r - c) board[r][c] = "." backtrack(0) return res queens_result = solve_n_queens(4) for solution in queens_result: print(solution) ``` 3. **高级挑战** - **题目描述**: 构建迷宫并利用DFS寻找最短路径。 ```python from collections import deque def bfs_maze(maze, start, end): rows, cols = len(maze), len(maze[0]) visited = [[False]*cols for _ in range(rows)] queue = deque([(start, [])]) while queue: (current_row, current_col), path = queue.popleft() if (current_row, current_col) == end: return path + [(current_row, current_col)] if not visited[current_row][current_col]: visited[current_row][current_col] = True directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 上下左右移动 for dr, dc in directions: nr, nc = current_row + dr, current_col + dc if 0 <= nr < rows and 0 <= nc < cols and maze[nr][nc] != "#" and not visited[nr][nc]: queue.append(((nr, nc), path + [(current_row, current_col)])) return [] maze = [ ["#", "#", ".", "."], [".", ".", "#", "."], [".", "#", ".", "."], [".", ".", ".", "."] ] shortest_path = bfs_maze(maze, (0, 2), (3, 3)) print(shortest_path) ``` --- #### 学习资源 为了更好地掌握DFS暴力解法的应用技巧,建议参考以下学习资料: 1. **官方文档与教程** 官方网站提供了丰富的比赛样例解析,其中包含了大量基于DFS的经典案例分析。 2. **在线课程** 参考引用提到的学习视频涵盖了动态规划、背包问题等内容,同时也涉及到了DFS的基础讲解部分[^2]。 3. **书籍推荐** - 《算法导论》:深入理解各种基本算法及其变种形式。 - 《Python Cookbook》:提供实际工程场景下的代码实例。 4. **刷题平台** LeetCode 和牛客网均设有专门面向蓝桥杯准备者的专项训练营,其中包括大量的DFS相关题目供参赛者反复演练。 --- #### 总结 通过对上述典例题的研究实践以及优质教育资源的有效利用,能够显著提高运用Python进行DFS暴力解法的能力水平。持续不断地积累经验并通过不断尝试新的复杂度更高的问题来巩固所学知识点是非常重要的过程之一。 相关问题
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值