当前位置: 首页 > article >正文

BFS算法的实现(例题)

         这是C++算法基础-搜索与图论专栏的第X篇文章,专栏详情请见此处


引入

        上篇博客,我们学习了BFS算法的大体套路,这次,我将会通过两个例题来更详细的讲解。

        下面我们就来讲BFS算法(例题)的实现。

过程

        例题1:走迷宫

        题目大意:给定一个二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。若一个人从左上角(1,1)出发,每次可以向周围四个位置移动一格,要移动至右下角(n,m)处,最少需要移动多少次。

        若该题目问的是是否能到达终点,那么用DFS算法就可以了,但此题要求最小移动步数,就需要考虑BFS算法的路径最短的特点了。

        我们从起点开始,往前走第一步,记录下所有第一步能走到的点,然后从所第一步能走到的点开始,往前走第二步,记录下所有第二步能走到的点,重复下去,直到走到终点,此时可以肯定的是,当前的步数一定最短,输出即可。

        例题2:八数码

        题目大意:在一个3×3的网格中,1~8这8个数字和一个“x”恰好不重不漏地分布在这3*3的网格中。

        在游戏过程中,可以把“x”与其上、下、左、右四个方向之一的数字交换(如果存在)。

        我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

        1 2 3
        4 5 6
        7 8 x

        请你求出得到正确排列最少需要进行多少次交换。

        玩过华容道的人都知道,这是很简单的3*3的数字华容道游戏,现实生活中肯定很多人都能做出来。但放到C++中,乍一看好像没什么思路,但此题要求得出最优答案,所以选择BFS算法。

        很重要的一点是,我们可以把游戏中的移动数字视为移动空格“x”,这样做的好处是操作由移动八个(数字)变为移动一个(空格)。空格从起点开始,往前走第一步,记录下所有第一步走过后的状态,然后从所第一步走到了的点开始,往前走第二步,记录下所有第二步走过后的状态,重复下去,直到达到目标状态,得出最优答案,输出即可。

        这里的一个实现困难就是二维数组的处理,实际上,我们可以将矩阵转换为字符串(下标需从0开始),对字符串进行处理,其中,转换公式为:下标:x*3+y、x:下标/3、y:下标%3、左移:下标-1、右移:下标+1、上移:下标-3、下移:下标+3。


上一篇-    C++算法基础专栏文章    下一篇-


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~


http://www.kler.cn/a/522839.html

相关文章:

  • QT 通过ODBC连接数据库的好方法:
  • MV结构下设置Qt表格的代理
  • MIMIC-IV数据部署(博主较忙,缓慢更新)
  • 过年之无用知识研究:恢复std::pair中被delete了的operator=,会如何
  • 用C++编写一个2048的小游戏
  • 洛谷U525322 优美区间
  • 开源物业管理系统赋能社区管理提升居民服务体验与满意度
  • Android源码阅读笔记(二)—— 启动模式
  • 理解 IS-IS 中重要概念之间的关系
  • 亚马逊多店铺运营攻略!如何实现多开店铺防关联?
  • 图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)
  • 基于微信小程序高校课堂教学管理系统 课堂管理系统微信小程序(源码+文档)
  • UG二开UF-常用方法
  • MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件
  • PhotoShop中JSX编辑器安装
  • 机器学习day4
  • Linux 学习笔记__Day2
  • 深入理解三高架构:高可用性、高性能、高扩展性的最佳实践
  • 刷题记录 贪心算法-3:376. 摆动序列
  • 【数据结构】(1)集合类的认识
  • 关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法
  • LLM - 大模型 ScallingLaws 的指导模型设计与实验环境(PLM) 教程(4)
  • php twig模板引擎详细使用教程
  • Electron学习笔记,安装环境(1)
  • Agnostiq:揭示LLM的记忆与推理机制
  • Vue3组件库开发指南:从0到1实现