剑指offer刷题记录10--机器人的运动范围(广度优先搜索)

该系列博客内容主要是《剑指Offer》中的经典题目,结合在刷题过程中见到的一些精彩的解题过程,从而在这里记录下来。代码以Python3实现。
在这里插入图片描述
题目分析
机器人从坐标(0,0)开始运动,当它准备进入坐标为(i,j)的格子时候,通过检查坐标的数位和来判断机器人是否能够进入,如果机器人能够进入坐标为(i,j)的格子,则再判断它是否可以进入4个相邻的格子。在这里,需要注意的是,有种情况是坐标虽然满足数位之和不大于k,但是不能从坐标(0,0)通过上下左右移动到达当前格子。如下图所示:
在这里插入图片描述
如何计算行坐标和列坐标的数位之和
在这里插入图片描述
在这里我们先用广度优先搜索的算法思想进行求解,那什么是广度优先搜索呢?
广度优先搜索(Breadth First Search,BFS)
广度优先搜索,一般用来解决最短路径的问题。和深度优先搜索不同,广度优先的搜索是从起始点出发,一层一层地进行,每层当中的点距离起始点的步数都是相同的,当找到了目的地之后就可以立即结束。
广度优先的搜索可以同时从起始点和终点开始进行,称之为双端 BFS。这种算法往往可以大大地提高搜索的效率。
举例:在社交应用程序中,两个人之间需要经过多少个朋友的介绍才能互相认识对方。
解法:
1.只从一个方向进行BFS,有时候这个人认识的朋友特别多,那么会导致搜索起来非常慢;
2.如果另外一方认识的人比较少,从这一方进行搜索,就能极大地减少搜索的次数;
3.每次在决定从哪一边进行搜索的时候,要判断一下哪边认识的人比较少,然后从那边进行搜索。
BFS遍历
例题:假设我们有这么一个图,里面有A、B、C、D、E、F、G、H 8 个顶点,点和点之间的联系如下图所示,对这个图进行深度优先的遍历。
在这里插入图片描述
解题思路
依赖队列(Queue),先进先出(FIFO)。
一层一层地把与某个点相连的点放入队列中,处理节点的时候正好按照它们进入队列的顺序进行。
第一步,选择一个起始顶点,让我们从顶点 A 开始。把 A 压入队列,标记它为访问过(用红色标记)。
在这里插入图片描述
第二步,从队列的头取出顶点 A,打印输出到结果中,同时将与它相连的尚未被访问过的点按照字母大小顺序压入队列,同时把它们都标记为访问过,防止它们被重复地添加到队列中。
在这里插入图片描述
第三步,从队列的头取出顶点 B,打印输出它,同时将与它相连的尚未被访问过的点(也就是 E 和 F)压入队列,同时把它们都标记为访问过。
在这里插入图片描述
第四步,继续从队列的头取出顶点 D,打印输出它,此时我们发现,与 D 相连的顶点 A 和 F 都被标记访问过了,所以就不要把它们压入队列里。
在这里插入图片描述
第五步,接下来,队列的头是顶点 G,打印输出它,同样的,G 周围的点都被标记访问过了。我们不做任何处理。
第六步,队列的头是 E,打印输出它,它周围的点也都被标记为访问过了,我们不做任何处理。
第七步,接下来轮到顶点 F,打印输出它,将 C 压入队列,并标记 C 为访问过。
第八步,将 C 从队列中移出,打印输出它,与它相连的 H 还没被访问到,将 H 压入队列,将它标记为访问过。
第九步,队列里只剩下 H 了,将它移出,打印输出它,发现它的邻居都被访问过了,不做任何事情。
第十步,队列为空,表示所有的点都被处理完毕了,程序结束。

接下来我们就看如何用广度优先搜索的思想来解答这道题。以下来自力扣大佬的解析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码如下
在这里插入图片描述
Question: 在这里优点看不懂为啥for dx,dy in [(1,0),(0,1)] 就是向下向右运动?
下面使用深度优先搜索的算法思想求解,同样来自力扣大佬的解析
在这里插入图片描述
在这里插入图片描述
代码如下
在这里插入图片描述
参考链接1
参考链接2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值