📜  门| GATE-CS-2015(套装2)|问题 9(1)

📅  最后修改于: 2023-12-03 15:42:18.081000             🧑  作者: Mango

门| GATE-CS-2015(套装2)|问题 9

这个问题需要编写一个程序,计算迷宫中的最短路径。

问题描述

给定一个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("不能到达终点")

现在你可以使用上述程序,计算迷宫中起点到终点的最短路径。