Skip to content

HJ43 迷宫问题 ​

本节目标:理解“HJ43 迷宫问题”的核心思路,并能把它用于实际开发或面试表达。 中等 通过率:33.18% 时间限制:1秒 空间限制:32M 知识点 ==查找== ==dfs== ==广度优先搜索(BFS)== 描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示:

int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。 数据范围:2≤n,m≤10 , 输入的内容只包含 0≤val≤1 输入描述: 输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。 输出描述: 左上角到右下角的最短路径,格式如样例所示。 示例1 输入: 5 50 1 0 0 00 1 1 1 00 0 0 0 00 1 1 1 00 0 0 1 0 ==复制== 输出: (0,0)(1,0)(2,0)(2,1)(2,2)(2,3)(2,4)(3,4)(4,4) ==复制== 示例2 输入: 5 50 1 0 0 00 1 0 1 00 0 0 0 10 1 1 1 00 0 0 0 0 ==复制== 输出: (0,0)(1,0)(2,0)(3,0)(4,0)(4,1)(4,2)(4,3)(4,4) ==复制== 说明: 注意:不能斜着走!!

这段代码是为了找到一个从迷宫入口(左上角)到出口(右下角)的路径,它使用了一种叫做广度优先搜索(BFS)的方法。下面是每一行代码的解释,用小学生也能理解的方式:

注意:

  • 走过的不再走
  • 要有一个终止条件
  • 四种情况的if用for循环四次来取代,因为逻辑是一样的
  • 至于如何得到路径,因为每一次循环都POP一下,如果走不通的,最终不会保留

定义一个用来在迷宫中找路径的函数 ​

def bfs(maze):

获取迷宫的行数和列数 ​

m, n = len(maze), len(maze[0])

如果迷宫是空的,就没有路径 ​

if m == 0 or n == 0: return []

准备一个队列,开始时只有起点在里面 ​

queue = [(0, 0, [(0, 0)])]

记录我们访问过的地方,开始时只有起点 ​

==visited== ===== ==set====([(====0====,== ==0====)])==

当队列不为空时,继续寻找路径 ​

while queue:

从队列中取出一个位置和到这个位置的路径 ​

row, col, path = queue.pop(0)

如果这个位置是出口,就找到了路径 ​

if (row, col) == (m - 1, n - 1): return path

尝试向上下左右四个方向移动 ​

==for== ==dx====,== ==dy== ==in== ==[(-====1====,== ==0====), (====1====,== ==0====), (====0====, -====1====), (====0====,== ==1====)]:==

计算移动后的位置 ​

next_row, next_col = row + dx, col + dy

如果新位置有效,并且没有被墙挡住,并且没有访问过 ​

if ( ==0== ==<=== ==next_row== ==<== ==m== ==and== ==0== ==<=== ==next_col== ==<== ==n== ==and== ==maze====[====next_row====][====next_col====] ==== ==0== ==and== ==(====next_row====,== ==next_col====)== ==not in== ==visited== ):

将新位置和到达新位置的路径加入队列 ​

queue.append( (next_row, next_col, path + [(next_row, next_col)]))

标记新位置为已访问 ​

visited.add((next_row, next_col))

如果走遍了所有可能的路都没有找到出口,就返回空列表 ​

return []

不停地读取输入,直到没有更多数据 ​

while True: try:

读取迷宫的行数和列数 ​

m, n = map(int, input().split()) maze = []

根据行数读取迷宫数据 ​

for _ in range(m): row = list(map(int, input().split())) maze.append(row)

使用BFS方法找路径 ​

path = bfs(maze)

打印找到的路径 ​

for step in path: print(f"({step[0]},{step[1]})")

如果读取数据时出错(例如没有更多数据了),就结束程序 ​

except EOFError: break

在这个代码中,我们首先定义了一个名为 bfs 的函数来寻找迷宫的路径。它首先检查迷宫是否为空,然后使用一个队列来存储我们尝试过的路径。我们从起点开始,逐步尝试向上、下、左、右四个方向移动,直到找到出口或者走遍所有可能的路。在主循环中,我们读取迷宫的大小和布局,然后调用 bfs 函数来寻找路径,并把路径打印出来。

本站总访问 — 次