题解 | #迷宫问题#
迷宫问题
http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
python3
参考大佬视频
如有冒犯马上删除
队列思路解题
from collections import deque
# 列出下一步可能走的方向
dirs = [
lambda x,y: (x,y-1),
lambda x,y: (x+1,y),
lambda x,y: (x, y+1),
lambda x,y: (x-1,y)
]
# 打印最短路径函数
def print_real(path):
curNode = path[-1]
real_path =[]
while curNode[2]!= -1:
real_path.append(curNode[0:2])
curNode = path[curNode[2]]
real_path.append(curNode[0:2])
real_path.reverse()
for i in real_path:
print(f'({i[0]-1},{i[1]-1})')
#建立一个队列—现在所在位置出队,下一步进队
def maze_path_queue(x1,y1,x2,y2):
path =[]
queue = deque()
queue.append((x1,y1,-1))
while len(queue)>0:
curNode = queue.pop()
path.append(curNode)
if curNode[0] == x2 and curNode[1] == y2:
print_real(path)
for dir in dirs:
nexNode = dir(curNode[0],curNode[1])
if maze[nexNode[0]][nexNode[1]] == 0:
queue.append((nexNode[0],nexNode[1], len(path)-1))
maze[nexNode[0]][nexNode[1]] = 2
# 将输入转换成一个四面都是墙的迷宫防止下一步越界
while True:
maze = []
try:
n,m = map(int, input().split())
for i in range(n):
maze.append([int(i) for i in input().split()])
for i in range(n):
maze[i].insert(0, 1)
maze[i].append(1)
maze.insert(0, [1 for i in range(n + 2)])
maze.append([1 for i in range(n + 2)])
maze_path_queue(1,1,n,m)
except:
break