📜  门|门CS 2012 |第 51 题(1)

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

门|门CS 2012 |第 51 题

这是一道关于搜索算法的题目,需要找到一条从起点到终点的最短路径。

题目描述

有一个矩形的迷宫,其中有一些点为墙壁,不能通过。现在给定起点和终点,请你编写一个程序,找到一条从起点到终点的最短路径,输出路径的长度。

输入格式

第一行包含两个整数n,m,表示迷宫的大小为n×m。

接下来n行,每行包含m个字符。其中字符 '.' 表示空地,字符 '#' 表示墙壁,字符 'S' 表示起点,字符 'E' 表示终点。

输出格式

输出一个整数,表示从起点到终点的最短路径的长度。如果不存在从起点到终点的路径,则输出 -1。

代码示例

以下是搜索算法的一个示例代码片段,使用广度优先搜索(BFS)解决。

from collections import deque

n, m = map(int, input().split())

maze = [input() for _ in range(n)]

# 初始化起点和终点坐标
sx, sy, ex, ey = 0, 0, 0, 0
for i in range(n):
    for j in range(m):
        if maze[i][j] == 'S':
            sx, sy = i, j
        elif maze[i][j] == 'E':
            ex, ey = i, j

# 记录起点到每个位置的距离,初始化为无穷大
dist = [[float('inf')] * m for _ in range(n)]

# BFS
q = deque([(sx, sy)])
dist[sx][sy] = 0
while q:
    x, y = q.popleft()
    # 如果到达终点,则直接退出循环
    if x == ex and y == ey:
        break
    for dx, dy in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
        nx, ny = x + dx, y + dy
        if 0 <= nx < n and 0 <= ny < m and maze[nx][ny] != '#' and dist[nx][ny] == float('inf'):
            dist[nx][ny] = dist[x][y] + 1
            q.append((nx, ny))

# 输出答案
if dist[ex][ey] == float('inf'):
    print(-1)
else:
    print(dist[ex][ey])

以上代码可以解决此题目,实现了从起点到终点的最短路径的长度的搜索。