题解 | #迷宫问题#
迷宫问题
http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
利用队列求解
from collections import deque dirs = [ lambda x,y:(x+1,y), lambda x,y:(x-1,y), lambda x,y:(x,y-1), lambda x,y:(x,y+1) ] def print_r(path): # 创建一个数组存储经过的路径 new_path = [] # 当前节点是path最后一个元素时 curNode = path[-1] # while curNode[2] != -1 : # 把当前节点添加到真正的列表里 new_path.append((curNode[0],curNode[1])) curNode = path[curNode[2]] #循环结束 curNode[2] = -1 时 ,为起点,添加至列表 new_path.append((curNode[0],curNode[1])) # 此时列表的顺序为倒序,需要转换一下 new_path.reverse() for i in new_path : print(f'({i[0]},{i[1]})') def maze_path_queue(n,m,maze): # 定义队列 queue = deque() # 初始化 队列 queue.append((0,0,-1)) # 创建一个列表存储出队的元素 path = [] while len(queue) > 0 : # 标记当前位置 curNode = queue.pop() # 将出队的元素存至path path.append(curNode) # 判断当前位置是否已经在出口 if curNode[0] == n-1 and curNode[1] == m-1: # print(1) print_r(path) return True # 计算出四个方向的位置 for dir in dirs: nextNode = dir(curNode[0],curNode[1]) if 0 <= nextNode[0] <= n-1 and 0 <= nextNode[1] <= m-1: if maze[nextNode[0]][nextNode[1]] == 0 : queue.append((nextNode[0],nextNode[1],len(path) -1)) # 后续节点进队 ,并记录是哪个节点带来的 maze[nextNode[0]][nextNode[1]] = 2 # print(1) else : print('No') return False n,m = map(int,input().strip().split()) maze = [list(map(int,input().strip().split())) for _ in range(n)] maze_path_queue(n,m,maze)