📅  最后修改于: 2023-12-03 15:42:18.081000             🧑  作者: Mango
这个问题需要编写一个程序,计算迷宫中的最短路径。
给定一个NxM的迷宫,其中每个单元要么是空白('.'),要么是障碍物('#')。你的任务是计算从起点到终点的最短路径的长度。起点和终点都是空白单元,保证存在一条从起点到终点的路径。
在这个问题中,我们将使用广度优先搜索(BFS)算法来找到最短路径。
首先,我们需要定义一个迷宫类,它将包含高度(rows),宽度(cols)和二维列表(grid)。
class Maze:
def __init__(self, rows, cols, grid):
self.rows = rows
self.cols = cols
self.grid = grid
接下来,我们将实现bfs函数来查找起点到终点的最短路径。
def bfs(maze, start, end):
queue = [start]
visited = set()
while queue:
current_node = queue.pop(0)
if current_node == end:
return True
visited.add(current_node)
neighbors = get_neighbors(current_node, maze)
for neighbor in neighbors:
if neighbor not in visited:
queue.append(neighbor)
return False
在这个函数中,我们使用一个队列来执行广度优先搜索。我们也用一个名为“visited”的集合来跟踪访问过的节点。我们的函数返回True如果可以从起点到达终点,否则返回False。
注意,我们还使用了一个get_neighbors函数,以查找给定节点的邻居。
def get_neighbors(node, maze):
row, col = node
neighbors = []
# 上
if row > 0 and maze.grid[row-1][col] != '#':
neighbors.append((row-1, col))
# 下
if row < maze.rows-1 and maze.grid[row+1][col] != '#':
neighbors.append((row+1, col))
# 左
if col > 0 and maze.grid[row][col-1] != '#':
neighbors.append((row, col-1))
# 右
if col < maze.cols-1 and maze.grid[row][col+1] != '#':
neighbors.append((row, col+1))
return neighbors
这个函数检查每个节点的上、下、左、右邻居是否为空白节点,并返回一个包含所有可用邻居的列表。
最后,我们在主函数中将读取输入,并调用类和函数。
def main():
rows, cols = map(int, input().split())
grid = []
for i in range(rows):
row = input().strip()
grid.append(list(row))
maze = Maze(rows, cols, grid)
start = None
end = None
for i in range(rows):
for j in range(cols):
if maze.grid[i][j] == 'S':
start = (i, j)
elif maze.grid[i][j] == 'E':
end = (i, j)
if bfs(maze, start, end):
print("可以到达终点")
else:
print("不能到达终点")
完整的程序实现如下所示。
class Maze:
def __init__(self, rows, cols, grid):
self.rows = rows
self.cols = cols
self.grid = grid
def bfs(maze, start, end):
queue = [start]
visited = set()
while queue:
current_node = queue.pop(0)
if current_node == end:
return True
visited.add(current_node)
neighbors = get_neighbors(current_node, maze)
for neighbor in neighbors:
if neighbor not in visited:
queue.append(neighbor)
return False
def get_neighbors(node, maze):
row, col = node
neighbors = []
# 上
if row > 0 and maze.grid[row-1][col] != '#':
neighbors.append((row-1, col))
# 下
if row < maze.rows-1 and maze.grid[row+1][col] != '#':
neighbors.append((row+1, col))
# 左
if col > 0 and maze.grid[row][col-1] != '#':
neighbors.append((row, col-1))
# 右
if col < maze.cols-1 and maze.grid[row][col+1] != '#':
neighbors.append((row, col+1))
return neighbors
def main():
rows, cols = map(int, input().split())
grid = []
for i in range(rows):
row = input().strip()
grid.append(list(row))
maze = Maze(rows, cols, grid)
start = None
end = None
for i in range(rows):
for j in range(cols):
if maze.grid[i][j] == 'S':
start = (i, j)
elif maze.grid[i][j] == 'E':
end = (i, j)
if bfs(maze, start, end):
print("可以到达终点")
else:
print("不能到达终点")
现在你可以使用上述程序,计算迷宫中起点到终点的最短路径。