题目内容
DFS代码
虽然求最短路径更应该用 BFS ,但是本题限定了只有唯一解,所以可以使用 DFS
# 四个方向移动
dirs = [
lambda x, y: (x+1, y),
lambda x, y: (x, y+1),
lambda x, y: (x-1, y),
lambda x, y: (x, y-1)
]
# x1, y1 为起点, x2, y2 为终点
def maze_path(x1, y1, x2, y2):
stack = []
stack.append((x1, y1))
# 当栈不为空时
while len(stack) > 0:
cur_node = stack[-1] # 当前节点为栈顶结点
# 如果走到终点,输出路径
if cur_node[0] == x2 and cur_node[1] == y2:
for i in stack:
print("({},{})".format(i[0]-1, i[1]-1))
break
# 往四个方向走
for dir in dirs:
next_node = dir(cur_node[0], cur_node[1])
if maze[next_node[0]][next_node[1]] == 0:
stack.append(next_node)
maze[next_node[0]][next_node[1]] = 2 # 标记为已经走过
break
# 回退
else:
maze[next_node[0]][next_node[1]] = 2 # 标记为已经走过
stack.pop()
while True:
maze = [] # 迷宫矩阵
try:
# 行和列
m, n = map(int, input().split())
# 接收输入的矩阵
for i in range(m):
maze.append(list(map(int,input().split())))
# 将迷宫矩阵外加一圈墙(1),防止越界
for i in range(m):
maze[i].insert(0, 1)
maze[i].append(1)
maze.insert(0, [1 for i in range(m + 2)])
maze.append([1 for i in range(m + 2)])
# 调用函数,输出最短路径
maze_path(1, 1, m, n)
except:
break
BFS代码
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):
cur_node = path[-1]
real_path = []
while cur_node[2] != -1:
real_path.append(cur_node[0:2])
cur_node = path[cur_node[2]]
real_path.append(cur_node[0:2])
real_path.reverse()
for i in real_path:
print("({},{})".format(i[0]-1, i[1]-1))
# x1, y1 为起点, x2, y2 为终点
def maze_path_queue(x1, y1, x2, y2):
path = []
queue = deque()
# 第三个值默认为-1,不为-1时表示该节点来自哪个结点
queue.append((x1, y1, -1))
while len(queue) > 0:
cur_node = queue.pop()
path.append(cur_node)
# 如果走到终点,输出路径
if cur_node[0] == x2 and cur_node[1] == y2:
print_real(path)
# DFS 找到一个方向可以走, 就 break 退出循环
# BFS 需要将可以走的每一个方向都入队, 所以不加 break
for dir in dirs:
next_node = dir(cur_node[0], cur_node[1])
if maze[next_node[0]][next_node[1]] == 0:
queue.append((next_node[0], next_node[1], len(path) - 1))
maze[next_node[0]][next_node[1]] = 2 # 标记为已经走过
while True:
maze = []
try:
# 行和列
m, n = map(int, input().split())
# 接收输入的矩阵
for i in range(m):
maze.append([int(i) for i in input().split()])
# 将迷宫矩阵外加一圈墙(1),防止越界
for i in range(m):
maze[i].insert(0, 1)
maze[i].append(1)
maze.insert(0, [1 for i in range(m + 2)])
maze.append([1 for i in range(m + 2)])
# 调用函数,输出最短路径
maze_path_queue(1, 1, m, n)
except:
break