蓝桥杯(五)——DFS和BFS

一、DFS

算法模板

递归问题可以画一个树来写,递归不要去思考全过程,只思考三步:

1. 看当前层的操作

2. 看第一层如何到第二层——递归过程

3. 然后看根节点是如何结束的——递归出口

def dfs(i):
    if 条件成立:
        收集结果
        return
    for 集合元素:
        处理节点
        递归函数
        回溯操作


 1. 子集型回溯

特点:每个元素可选可不选

例1.1 子集

题目在这~

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的

子集

(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

代码1:以结果的思维来写:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        n=len(nums)
        if n==0:
            return [[]]
        res=[]
        path=[]
        def dfs
### 蓝桥杯中的DFSBFS算法实现及应用 #### 深度优先搜索 (DFS) 深度优先搜索是一种用于遍历或搜索图或树的算法。它的核心思想是从起始节点出发,沿着某条路径尽可能深入地探索下去,直到无法继续为止。如果到达某个叶子节点而未找到解,则会回溯至上一节点并尝试其他可能的路径。 在 Python 中,可以通过递归来实现 DFS 的逻辑结构。下面是一个典型的例子:排列数字问题[^2]。 ```python def dfs(path, used, depth, max_depth): if depth == max_depth: print(''.join(map(str, path))) return for i in range(1, max_depth + 1): if not used[i]: path.append(i) used[i] = True dfs(path, used, depth + 1, max_depth) used[i] = False path.pop() n = 3 used = [False] * (n + 1) dfs([], used, 0, n) ``` 上述代码展示了如何通过递归的方式生成给定长度的所有排列组合。`path` 存储当前已选的数列,`used` 数组标记哪些数字已被使用过,从而避免重复选取同一数字。 #### 广度优先搜索 (BFS) 广度优先搜索则采用另一种策略来解决问题。它从根节点开始逐层扩展邻居节点,确保在同一层次上的所有节点都被访问之后才进入下一层级。这种特性使得 BFS 特别适合寻找最短路径的问题。 通常情况下,在编程语言中可以利用队列的数据结构来辅助完成 BFS 过程。这里给出一个简单的迷宫求解实例作为说明: ```python from collections import deque def bfs(maze, start, end): queue = deque([(start, [])]) visited = set() while queue: current, path = queue.popleft() if current == end: return path + [current] if current not in visited: visited.add(current) for neighbor in get_neighbors(maze, current): if neighbor not in visited: queue.append((neighbor, path + [current])) return None def get_neighbors(maze, position): directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] neighbors = [] for dx, dy in directions: nx, ny = position[0] + dx, position[1] + dy if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] != '#': neighbors.append((nx, ny)) return neighbors maze = [ ['.', '.', '.'], ['#', '#', '.'], ['.', '.', '.'] ] print(bfs(maze, (0, 0), (2, 2))) ``` 此段程序定义了一个 `bfs` 函数用来解决二维网格内的寻路问题。其中 `get_neighbors` 辅助函数负责返回当前位置周围有效的相邻位置集合[^3]。 #### 列表切片补充总结 对于列表操作而言,Python 提供了非常简洁明了的方法来进行子序列提取 —— 即所谓的 **切片** 功能。例如获取原数组的一部分可以直接写成如下形式: ```python arr = list(range(10)) sub_arr = arr[2:8:2] # 表示取索引范围为2至7之间的偶数值部分 ``` 以上语句创建了一个新的列表对象 `sub_arr=[2,4,6]`, 它包含了原始列表 `arr` 自第2个元素起到第7个元素之间每隔一步取出的一个新列表[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值