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

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.lryc.cn/news/527641.html

相关文章:

  • clean code阅读笔记——如何命名?
  • MacOS 如何解决无法打开 ‘xxx’,因为 Apple 无法检查其是否包含恶意软件
  • Java并发学习:进程与线程的区别
  • 省市区三级联动
  • springboot 动态配置定时任务
  • 数据结构与算法学习笔记----求组合数
  • Arouter详解・常见面试题
  • 全志开发板 视频输入框架
  • 寒假学web--day10
  • 【全栈】SprintBoot+vue3迷你商城(9)
  • 系统思考—问题分析
  • 系统架构设计师教材:信息系统及信息安全
  • 美国三种主要的个人数据产业模式简析
  • js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化
  • 每日一道算法题
  • 低代码系统-产品架构案例介绍、明道云(十一)
  • 论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)
  • 利用机器学习创建基于位置的推荐程序
  • 每日一题 429. N 叉树的层序遍历
  • AIP-132 标准方法:List
  • CSAPP学习:前言
  • 【统计的思想】假设检验(二)
  • KNN算法学习实践
  • 数据可视化的图表
  • 动手学深度学习-卷积神经网络-3填充和步幅
  • 【JS|第28期】new Event():前端事件处理的利器
  • Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)
  • 【Spring】Spring启示录
  • ospf动态路由配置,cost路径调整,ospf认证实验
  • 在Rust应用中访问.ini格式的配置文件