广度优先搜索(Breadth First Search,简称bfs)是属于图论的一种,广泛应用于数据结构的搜索,通常用于解决一些最短路径的问题。

广度优先搜索的核心思路是:确定一个或多个源点,以这些源点为起点向外发散,确定下一步可能会走到的所有点(必要时可使用哈希去重,记录走过的点,因为有些时候bfs可能会进入死循环,并且可以验证:一个点若在第n次遍历时走到过,此后的任意一次遍历走到的这个点必然没有第一次走到的时候快),将这些点当成源点,再进行一次扩散,如此往复以找到最短路径。

模板代码:

present = [start]  # 起始点(一个点或多个点)
num = 0  # 从起始点到目标点需要走的次数
visited = set()  # 去重while present:future = []  # 创建一个空列表用来储存扩散点for i in present:  # 遍历源点,扩散寻找for x, y in [1, 0], [0, 1], [-1, 0], [0, -1]:  # 以一个点的走法为上下左右为例if (present[0] + x, present[1] + y) in visited:  # 去重continueif ...:  # 判断能否由起始点走到该扩散点,如图的大小限制或障碍物等visited.add((present[0] + x, present[1] + y))  # 将走过的点记录future.append((present[0] + x, present[1] + y))  # 将可以走到的点加入扩散点列表中present = future  # 将此次的扩散点作为下一次的起始点num += 1  # 走的步数 + 1

例题:打开转盘锁(Leetcode上第752题  https://leetcode-cn.com/problems/open-the-lock)

你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' 。每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 。每次旋转都只能旋转一个拨轮的一位数字。

锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。

列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。

字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。

示例 1:

输入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"
输出:6
解释:
可能的移动序列为 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。
注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的,
因为当拨动到 "0102" 时这个锁就会被锁定。
示例 2:

输入: deadends = ["8888"], target = "0009"
输出:1
解释:把最后一位反向旋转一次即可 "0000" -> "0009"。
示例 3:

输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
输出:-1
解释:无法旋转到目标数字且不被锁定。

思路:这题要我们求锁的最小旋转次数,所以我们可以优先考虑广度优先搜索。

代码实现:

class Solution(object):def openLock(self, deadends, target):""":type deadends: List[str]:type target: str:rtype: int"""lock = set()for i in deadends:lock.add(i)  # 将无法转到的锁组合加入集合中,避免后续取到present = ["0000"]  # 起始点visited = set()  # 定义去重集合num = 0while present:future = []for q in present:if q == target:  # 说明找到了,返回答案return numif q not in visited:  # 去重visited.add(q)if q in lock:  # 如果取到了死亡数字,则跳过continuefor i in range(4):  # 锁的每一个数字一共有两种取法,第一种+1第二种-1,注意对10取余以免超出范围f = list(q)f[i] = str((int(f[i]) + 1) % 10)future.append("".join(f))f[i] = str((int(f[i]) + 8) % 10)  # 防止取到负数,用+8代替-1future.append("".join(f))present = futurenum += 1return -1

希望我的分享对您有所帮助!

[广度优先搜索]python实现相关推荐

  1. 图的广度优先搜索--python实现

    最近在看<算法图解>,第六章中的广度优先搜索中的题目.自己实现一遍,算是做个记录吧. 关系网络图如下: 目的:找到朋友与朋友的朋友这些人中,谁是 Seller. 大体思路: 首先使用散列表 ...

  2. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  3. Python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  4. 迷宫问题 深度优先搜索 广度优先搜索 宽度优先搜索【python】

    文章目录 一.实验内容 二.深度优先搜索和广度优先搜索总结 1.深度优先搜索算法 2.广度优先搜索算法 三.实验代码和用于测试的迷宫 1.实验代码 2.测试迷宫 2.1 maze1.txt 2.2 m ...

  5. 广度优先搜索、宽度优先搜索,《学点算法吧,Python》

    一.广度优先搜索 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. 广度优先搜索是一种用于图的查找方法,可以帮助解决两个问题: 从节点A出发,有前 ...

  6. 数据结构与算法(python):广度优先搜索(Breadth First Search,BFS)和深度优先算法(Depth First Search,DFS)

    参考自 MOOC数据结构与算法Python版 目录 一.广度优先搜索 1.1 BFS算法过程 1.2 广度优先搜索算法分析 二.深度优先搜索 2.1 骑士周游 2.1.1 问题定义 2.1.2 构建骑 ...

  7. python二叉树广度遍历_黄哥Python: 二叉树的广度优先搜索的二种方法

    特别提示,转行的朋友,2019年不学习数据结构和算法,不刷Leetcode 等面试题库,是找不到程序员工作或者说找不到好的工作.黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次​zh ...

  8. 使用Python实现广度优先搜索

    图 图模拟一组连接,由节点和边组成,一个节点可能与众多节点直接相连,这些节点被称为邻居. 广度优先搜索 广度优先搜索是一种图算法,主要解决两种问题:        1.从节点A出发,有前往节点B的路径 ...

  9. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

最新文章

  1. 第十六届全国大学生智能汽车竞赛安徽赛区赛事指南
  2. 有道精品课python-Python:7行代码爬取有道词典
  3. Linux单用户模式、救援模式、克隆虚拟机与Linux机器互相登录
  4. 用Way.EntityDB进行Entity Framework Core数据库建模
  5. Flink 作为现代数据仓库的统一引擎:Hive 集成生产就绪!
  6. JavaScript 读写 span标签的值 - 代码篇
  7. Python提取Word文档中所有超链接地址和文本
  8. 一个DirectInput演示程序
  9. 朋友圈加粗字体数字_可爱搞笑的女生朋友圈文案
  10. word课程表设置符号与编号_小学生课程表word模板 小学生使用WORD.doc
  11. 举一反三的贝壳网爬虫
  12. python代码测试健康指数计算器_python编写的bmi体重指数计算器、出租车费用计算器、个税计算器、猜数字游戏...
  13. Android存储之MediaStore的使用
  14. 【狂神说】Spring Cloud
  15. 云呐数据备份|什么是结构化数据
  16. 计算机网络电视如何配置,关于电脑控制网络电视的方法
  17. 企业网盘+超融合,联想云加速的双引擎
  18. 调查:秋色园QBlog 博客开源不开源,您的建议是?
  19. 批量检测链接是否有效
  20. Hybrid APP架构设计思路

热门文章

  1. java logger 日志级别_Java如何设置Logger日志级别?
  2. 【GANS】对Stylgan2的动漫头像预训练模型进行【属性编辑】
  3. 热搜!华为 30 岁以下员工仅占 28%,网友:35 岁危机呢?
  4. linux启动盘制作hdd无法启动不了,我的U盘安装了pe重启后不认u盘,已在bois设置了第一启动为hdd为什么?求助!...
  5. 自媒体盈利模式有哪些?如何实现盈利?
  6. linux soft raid50
  7. addAll方法——向Set集合添加另一个集合的所有内容
  8. thinkpad卡在logo界面_当大地win7旗舰版电脑开机卡在Thinkpad LOGO画面无法进入桌面怎么办...
  9. Python_绘制图像
  10. 使用驱动器X:中的光盘之前需要将其格式化,是否将其格式化格式化の解决办法