【算法】蓝桥杯dfs深度优先搜索之凑算式总结

本文               → 《【算法】蓝桥杯dfs深度优先搜索之凑算式总结》

相关文章        →《【算法】蓝桥杯dfs深度优先搜索之排列组合总结》

                      →《【算法】蓝桥杯dfs深度优先搜索之图连通总结》

 

前言

曾几何时这个词现在用正适合不过了。

曾几何时我还是对dfs算法一脸懵x的状态,虽说大二的时候学过数据结构,但是那一学期被我荒废了......详情等我毕业了再说吧。

还有四天就要考蓝桥杯了,我分析了近四年的蓝桥杯(B组)题型,分类纯属个人理解,并非官方宣布,如下表:

注:

以下DFS代表Depth First Search首字母缩写,即深度优先搜索,简称深搜

以下DP代表Dynamic Programming首字母缩写,即动态规划,没有简称 : )

 

2015年(第六届)蓝桥杯B组省赛
分类 题号 总分
水题 1(3分)、2(5分)、4(11分) 19分
DFS/爆破 3(9分)、5(15分)、7(21分) 45分

冒泡

(加法乘法)

6(17分) 17分

取余

(饮料换购)

8(13分) 13分
矩阵 9(25分) 25分
DP 10(31分) 31分
2016年(第七届)蓝桥杯B组省赛
分类 题号 总分
递推 1(3分)、2(5分) 8分
函数调用 4(11分) 11分
DFS/爆破

3(9分)、5(13分)、

6(15分)、7(19分)、

8(21分)

77分
DP 9(23分) 23分
数据结构 10(31分) 31分
2017年(第八届)蓝桥杯B组省赛
分类 题号 总分
文件处理 1(5分)、3(13分) 18分
DFS/爆破 2(11分)、4(17分) 28分
水题 5(7分) 7分
DP 6(9分)、8(21分) 30分
日期问题 7(19分) 19分
二分问题 9(23分) 23分
前缀和 10(25分) 25分
2018年(第九届)蓝桥杯B组省赛
分类
### 蓝桥杯 DFS 题目 Python 实现与解法 #### 一、深度优先搜索DFS)简介 深度优先搜索是一种用于遍历或搜索树或图的算法。该方法会尽可能深地探索每一个分支,直到达到目标节点或者无法继续为止[^2]。 --- #### 二、基于蓝桥杯竞赛的 DFS 应用场景 在蓝桥杯竞赛中,DFS 常被用来解决涉及路径寻找、组合枚举以及状态转移等问题。例如,在某些题目中需要找到从起点到终点的所有可能路径,可以采用 DFS 来实现这一过程,并通过记忆化搜索优化性能。 --- #### 三、具体实例解析 ##### 示例 1:十四届蓝桥杯 STEMA 考试 Python 真题 (编程第五题) 此题要求使用 DFS 寻找从起点到终点的所有可行路径。以下是其 Python 实现: ```python from collections import defaultdict, deque def dfs(graph, start, end, path, visited, all_paths): if start == end: all_paths.append(path.copy()) return for neighbor in graph[start]: if not visited[neighbor]: visited[neighbor] = True path.append(neighbor) dfs(graph, neighbor, end, path, visited, all_paths) path.pop() visited[neighbor] = False # 构建图结构 graph = defaultdict(list) n_edges = int(input("请输入边的数量: ")) for _ in range(n_edges): u, v = map(int, input().split()) graph[u].append(v) start_node = int(input("请输入起始节点: ")) end_node = int(input("请输入结束节点: ")) visited = {node: False for node in graph} all_paths = [] dfs(graph, start_node, end_node, [start_node], visited, all_paths) print(f"从{start_node}到{end_node}的所有路径:") for p in all_paths: print(p) ``` 上述代码实现了基于邻接表的 DFS 搜索逻辑,能够找出所有从 `start` 到 `end` 的路径。 --- ##### 示例 2:算式问题(蓝桥杯经典 DFS 类型) 此类问题是典型的回溯算法应用案例之一。以下是一个简单的例子及其解决方案: 假设我们需要利用给定的一组数字拼出满足特定条件的表达式,则可以通过 DFS 进行穷举尝试。 ```python results = [] def dfs(nums, target, current_expr, index): if index == len(nums): if eval(current_expr) == target: results.append(current_expr) return # 尝试加号操作 dfs(nums, target, f"{current_expr}+{nums[index]}", index + 1) # 尝试减号操作 dfs(nums, target, f"{current_expr}-{nums[index]}", index + 1) numbers = list(map(int, input("输入一组整数,以逗号分隔: ").split(','))) target_value = int(input("输入目标值: ")) initial_expression = str(numbers[0]) dfs(numbers, target_value, initial_expression, 1) if results: print("符合条件的表达式有:") for expr in results: print(expr) else: print("未找到任何符合条件的表达式") ``` 这段程序展示了如何借助 DFS 对不同运算符进行排列组合来匹配指定的目标值[^3]。 --- #### 四、注意事项 - **剪枝优化**:为了提高效率,可以在适当位置加入约束条件提前终止无意义的递归分支。 - **内存管理**:当面临大规模数据集时需注意避免栈溢出风险;可考虑改写成迭代版本或其他替代方案如 BFS 或 A* 算法等。 ---
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值