dfs回溯模板

void dfs(参数)
{
	if(搜到了)
	{
		计数或进行其他操作;
		return;
	}
	for(查找当前节点的周围的节点)
	{
		进行其他的操作;
		标记已经搜索过的节点;
		dfs(下一次搜索的节点);
		取消标记;
	}
}
	 
	 

dfs只管拓展下一个。 不要一开始就标记

### Python 实现深度优先搜索 (DFS) 的模板代码 对于树或图的遍历,可以采用递归方式来实现深度优先搜索。下面提供了一个通用的Python DFS算法模板: ```python def dfs(graph, node, visited): if node not in visited: print(node, end=' ') visited.add(node) for neighbour in graph[node]: dfs(graph, neighbour, visited) graph = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F'], 'D': [], 'E': ['F'], 'F': [] } visited = set() # Set to keep track of visited nodes. dfs(graph, 'A', visited) # Call the function with start node as argument.[^1] ``` 此段代码定义了`dfs()`函数接收三个参数:一个是表示图的数据结构`graph`;另一个是要探索的当前节点`node`;最后是记录已访问过的节点集合`visited`。 当处理迷宫等问题时,则可能需要用到显式的栈(stack),以便于追踪路径并支持回溯操作。这里给出另一种基于堆栈版本的DFS实现方法: ```python def iterative_dfs(start_vertex, target_value): path = [start_vertex] stack = [(start_vertex, path)] while len(stack) > 0: (vertex, path) = stack.pop() print(vertex, end=" ") for neighbor in vertex.adjacent_vertices(): if isinstance(target_value, type(None)) or neighbor.value != target_value: stack.append((neighbor, path + [neighbor])) # Note: This code assumes that each vertex has an adjacent_vertices method which returns all vertices connected directly from it, # and also a value attribute representing its own value. Adjust according to actual data structures used.[^4] ``` 上述迭代形式更适合解决需要记住到达特定位置所经过路线的问题场景,并且易于理解与调试。 #### 非递归版带返回路径功能的DFS: 有时还需要获取从起点到终点的具体路径,在这种情况下可以在原有基础上稍作修改加入路径保存机制: ```python def find_path_dfs(maze, start, goal): stack = [(start, [])] while stack: current, path = stack[-1] if current == goal: return path+[current] neighbors = maze[current] - set(path) if neighbors: next_node = neighbors.pop() stack.append((next_node, path + [current])) else: stack.pop() maze = {'A':set(['B','C']), 'B':set(['A','D','E']), 'C':set(['A','F']), 'D':set(['B']), 'E':set(['B','F']), 'F':set(['C','E'])} print(find_path_dfs(maze,'A','F')) #[^5] ``` 这段程序展示了如何通过维护一个包含当前位置以及之前走过路径的信息列表来进行非递归形式的DFS搜索,最终找到由给定起点至目标点的一条可行路径。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值