### 蓝桥杯中的DFS和BFS算法实现及应用
#### 深度优先搜索 (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]。
---