迷宫最短路径求解

上节中只是提到了如何找到迷宫的通路,但是很显然有些迷宫不止一条通路,所以怎样才能求得迷宫最短路径呢?


要找到最短路径,那必然需要知道所有的路径,才能找出最短路径。所以最重要的还是利用栈和回溯法,同时和递归结合起来。

思路:首先从入口点开始,查找下一个结点的时候要与当前结点进行比较,因为所有路过的结点都是被标记的,表示的是从入口点到当前点所走的长度,而且都是递增。

所以有可能被比较的对象是已经被标记过的。理论上已经标记的点如果值小于当前点的值就不能在访问,因为表示形成环了,而且当前的路径更长,没有必要在进行下去。要进行回溯。不过要注意判断的临界点

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 利用实现迷宫路径求解: 算法步骤: 1. 将起点压入中,并将起点设置为已访问。 2. 对于顶元素,依次遍历其四个方向的相邻点,如果该点未访问且可以通过,则将该点压入中,并将其设置为已访问。 3. 如果顶元素为终点,则返回路径。 4. 如果顶元素无法继续移动,则弹出顶元素。 代码实现: ```python def maze_path(maze, start, end): stack = [start] visited = set() while stack: curr = stack[-1] if curr == end: return stack found = False for next in [(curr[0]-1, curr[1]), (curr[0]+1, curr[1]), (curr[0], curr[1]-1), (curr[0], curr[1]+1)]: if next not in visited and maze[next[0]][next[1]] == 0: stack.append(next) visited.add(next) found = True break if not found: stack.pop() return None ``` 2. 利用队列实现迷宫最短路径求解: 算法步骤: 1. 将起点加入队列,并将其设置为已访问。 2. 当队列不为空时,取出队首元素,遍历其四个方向的相邻点,如果该点未访问且可以通过,则将该点加入队列,并将其设置为已访问。 3. 如果该点为终点,则返回路径长度。 4. 如果队列为空,则表示无法到达终点。 代码实现: ```python def maze_shortest_path(maze, start, end): queue = [(start, 1)] visited = set() visited.add(start) while queue: curr, step = queue.pop(0) if curr == end: return step for next in [(curr[0]-1, curr[1]), (curr[0]+1, curr[1]), (curr[0], curr[1]-1), (curr[0], curr[1]+1)]: if next not in visited and maze[next[0]][next[1]] == 0: queue.append((next, step+1)) visited.add(next) return -1 ``` 3. 利用递归实现迷宫所有路径求解: 算法步骤: 1. 从起点开始,依次遍历其四个方向的相邻点,如果该点未访问且可以通过,则将其加入路径中,并将其设置为已访问。 2. 如果该点为终点,则将当前路径加入结果集中。 3. 如果该点无法继续移动,则将其从路径中删除。 4. 对于路径中的每一个点,重复步骤1-3。 代码实现: ```python def maze_all_paths(maze, start, end, path, paths): path.append(start) if start == end: paths.append(path[:]) else: for next in [(start[0]-1, start[1]), (start[0]+1, start[1]), (start[0], start[1]-1), (start[0], start[1]+1)]: if next not in path and maze[next[0]][next[1]] == 0: maze_all_paths(maze, next, end, path, paths) path.pop() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值