前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用栈实现广度优先搜索(BFS)解决迷宫问题

用栈实现广度优先搜索(BFS)解决迷宫问题

作者头像
算法与编程之美
发布2023-08-22 14:28:51
3140
发布2023-08-22 14:28:51
举报
文章被收录于专栏:算法与编程之美

1 问题

迷宫问题是一种常见的计算机科学问题,通常需要在二维网格上找到从起点到终点的路径,同时避开所有障碍物。这种问题经常涉及到计算机图形学、人工智能和路径规划等领域。如何寻找从起点到终点的路径并避开所有障碍物是一个经典的问题,那么该使用什么方法解决此类问题呢?

2 方法

广度优先搜索算法(BFS)是解决迷宫问题的一种有效方法。BFS算法初始化一个队列和一个集合,队列用于存储待搜索单元,集合用于存储已搜过的节点。基本思路是从起点开始进行遍历,并将与其相邻的、未被访问过的单元格加入到队列中,以便下一次遍历。由于BFS算法会优先访问距离起点近的单元格,因此该算法可以保证找到最短路径。

  1. 定义节点类,包含单元的坐标和节点的父节点
  2. 判断单元格是否为障碍物,并将起点和终点添加到栈中
  3. 初始化一个栈和一个集合,将起点加入栈中并将其标记为已访问
  4. 当栈非空时,弹出栈顶元素,并检查是否到达终点。如果是,则返回路径;否则,遍历当前节点的相邻未访问节点,将其加入栈中并标记为已访问
  5. 如果找不到路径,返回None

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

# 定义一个节点类,该节点包含了单元的坐标和节点的父节点,用于记录路径。class Node: def __init__(self, row, col, parent=None): self.row = row self.col = col self.parent = parent# 实现一个函数,用于判断单元格是否为障碍物,以及将起点和终点添加到栈中。def is_valid(maze, row, col): if row < 0 or row >= len(maze) or col < 0 or col >= len(maze[0]) or maze[row][col] == 1: return False return Truedef solve_maze(maze, start, end): stack = [Node(start[0], start[1])] # 将起点加入栈中 visited = [[False for _ in range(len(maze[0]))] for _ in range(len(maze))] visited[start[0]][start[1]] = True while stack: cur_node = stack.pop() # 弹出栈顶元素 if cur_node.row == end[0] and cur_node.col == end[1]: # 如果到达终点,则返回路径 path = [] while cur_node: path.append((cur_node.row, cur_node.col)) cur_node = cur_node.parent return path[::-1] # 返回从起点到终点的路径 # 将当前节点的相邻未访问节点加入栈中 for row, col in [(cur_node.row, cur_node.col-1), (cur_node.row+1, cur_node.col), (cur_node.row, cur_node.col+1), (cur_node.row-1, cur_node.col)]: if is_valid(maze, row, col) and not visited[row][col]: next_node = Node(row, col, cur_node) stack.append(next_node) visited[row][col] = True return None # 如果没有路径,则返回 None# 定义一个迷宫进行测试:maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0]]start = (0, 0)end = (4, 4)print(solve_maze(maze, start, end))# 输出:[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (3, 2), (4, 2), (4, 3), (4, 4)]

3 结语

针对解决“迷宫问题“,提出“广度优先搜索(BFS)”方法,证明该方法是有效的。基于BFS算法,使用栈来存储待搜索单元,并通过判断单元是否可以访问和是否已经访问过来对节点进行遍历。虽然该算法可以找到最短路径,但由于栈的特性,它也可能导致一些路径无法被找到。因此,在某些情况下,这种算法可能不是最佳选择。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档