给定一个迷宫,给出起点和终点,找出从起点出发到终点的有效可行路径,并求出长度。迷宫可以用二维数组A来存储表示。0表示通路,1表示障碍。此处规定移动可以从上、下、左、右四个方向移动。坐标以行下标和列下标表示,均从0开始。迷宫可行路径可能有多条,且路径长度可能不一。输出路径长度最短路径。
输入描述:
第一行包含两个整数m与n,分别表示二维数组的行数、列数 第2~m+1行,每行包含n个数(0或1) 第m+2行包含两个整数表示起点的行下标和列下标 第m+3行包含两个整数表示终点的行下标和列下标
输出描述:
第一行输出从起点出发到终点的最短路径长度 第二行输出最短路径,路径以多个(x,y)坐标表示,每组坐标中间以空格分隔
输入样例:
5 5
0,0,0,0,0
0,1,0,1,0
0,1,1,0,0
0,1,1,0,1
0,0,0,0,0
0,0
4,4
输出样例:
8
(0,0)(1,0)(2,0)(3,0)(4,0)(4,1)(4,2)(4,3)(4,4)
注:代码没有经过测试,只通过样例,如有问题请留言。
from collections import deque
def bfs(maze, start, end):
m, n = len(maze), len(maze[0])
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 上下左右四个方向
queue = deque([(start[0], start[1], [(start[0], start[1])])]) # 队列中存储当前坐标和路径
visited = set()
visited.add((start[0], start[1]))
while queue:
x, y, path = queue.popleft()
if (x, y) == end:
return len(path) - 1, path # 返回路径长度和路径
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < m and 0 <= ny < n and maze[nx][ny] == 0 and (nx, ny) not in visited:
queue.append((nx, ny, path + [(nx, ny)]))
visited.add((nx, ny))
return -1, [] # 如果没有路径,返回-1和空路径
def main():
import sys
input = sys.stdin.read
data = input().strip().split('\n')
m, n = map(int, data[0].split())
maze = [list(map(int, row.split(','))) for row in data[1:m+1]]
start = tuple(map(int, data[m+1].split(',')))
end = tuple(map(int, data[m+2].split(',')))
length, path = bfs(maze, start, end)
if length == -1:
print("没有可行路径")
else:
print(length)
print(" ".join(f"({x}, {y})" for x, y in path))
if __name__ == "__main__":
main()