Python矩阵4方向全路径查找代码问题:无法返回所有路径如何修复
矩阵四方向全路径查找修改方案
原代码核心问题
- 仅执行了单次移动逻辑,没有循环/递归遍历机制,无法生成完整路径
- 无回溯逻辑,遇到分叉路径只会选择第一个符合条件的方向,无法覆盖所有路径分支
- 无重复访问标记,未避免走回头路导致的路径循环问题
- 预处理逻辑错误:将集合V直接解包为(a,b)生成range的逻辑完全不符合集合取值逻辑,且
B=I为浅拷贝会修改原输入矩阵 - 缺失终点触发逻辑,到达终点后没有执行路径保存操作
修正后完整代码
def find_path(I, x1,y1,x2,y2,V, path_type): lr = len(I) lc = len(I[0]) if lr > 0 else 0 # 深拷贝输入矩阵生成通行标记矩阵,避免修改原数组 B = [row.copy() for row in I] # 预处理标记可通行区域 for i in range(lr): for j in range(lc): B[i][j] = 'a' if B[i][j] in V else 'b' # 标记终点 end_x, end_y = x2 - 1, y2 - 1 B[end_x][end_y] = 'q' # 起点坐标转换 start_x, start_y = x1 - 1, y1 - 1 Tp = [] # 仅处理path_type=4的逻辑 if path_type == 4: # 定义DFS遍历函数 def dfs(x, y, current_path): # 到达终点,保存路径 if B[x][y] == 'q': Tp.append(current_path.copy()) return # 四方向遍历:上下左右 directions = [(-1,0), (1,0), (0,-1), (0,1)] for dx, dy in directions: nx = x + dx ny = y + dy # 判断坐标合法、可通行、未在当前路径中(避免走回头路) if 0 <= nx < lr and 0 <= ny < lc: if (B[nx][ny] == 'a' or B[nx][ny] == 'q') and (nx, ny) not in current_path: current_path.append((nx, ny)) dfs(nx, ny, current_path) # 回溯 current_path.pop() # 起点合法性判断 if 0 <= start_x < lr and 0 <= start_y < lc and (B[start_x][start_y] == 'a' or B[start_x][start_y] == 'q'): dfs(start_x, start_y, [(start_x, start_y)]) # 无路径时添加提示,不需要可删除下行 if not Tp: Tp.append(["no path"]) return Tp # 测试用例 I=[[1,0,3,2,4],[4,3,4,0,2],[2,2,1,3,0],[2,4,0,3,2],[3,2,4,1,0]] x1=4 y1=1 x2=2 y2=5 V={4,2} path_type=4 A=find_path(I, x1,y1,x2,y2,V, path_type) # 打印所有路径 for idx, path in enumerate(A): print(f"路径{idx+1}: {path}")
代码说明
- 保留了原代码
path_type==4的判断逻辑,符合需求要求 - 采用DFS深度优先搜索遍历所有四方向可行路径,自带回溯机制覆盖所有分叉路径
- 通过判断坐标是否已存在于当前路径避免重复访问和循环问题
- 预处理逻辑修正为直接判断矩阵值是否属于集合V,完全符合可通行规则要求
- 到达终点自动保存路径,所有路径探索完成后统一返回结果集,无第三方模块依赖
内容的提问来源于stack exchange,提问作者Arvind Meena
相关产品推荐
相关产品推荐

