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

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

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

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/open-the-lock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————

对于位置锁的每一个状态,其下一个状态总共有八种。位置锁的位数为4位,每一位可以向上或者向下移动一次,因此又8个状态。

起始状态为“0000”,将起始状态放进队列中,判断其是否是死亡数字,如果不是死亡数字同时不是目标数字,则遍历其八种情况。

因为这八种情况中有可能部分情况已经遍历过,因此需要维护一个set集合,将已经检查过的锁值存放进去,当八种状态中有部分状态已经在集合中时,则跳过这种状态。

同时存进队列中的不仅仅是每一步的位置锁的信息,同时还有这是第几步得到的状态锁。

具体Python代码如下所示:

class Solution:def openLock(self, deadends: List[str], target: str) -> int:def neighbors(strs):  # 当前位置锁的八种状态for i in range(len(strs)):num = int(strs[i])for j in [-1,+1]:nums = (num+j)%10yield strs[0:i] + str(nums) + strs[i+1:]queue = collections.deque([["0000",0]])  # 队列存放的是要检索的位置锁和当前的步数sets = set("0000")  # 存放已经遍历过的位置锁状态while queue:strs,index = queue.popleft()if strs in deadends:  # 如果当前位置锁是死亡数字,则跳过当前数字continueif strs == target:  # 如果当中位置锁是目标数字锁,则返回步数return indexfor num in neighbors(strs):  # 遍历当前位置锁的八种状态if num not in sets:  # 如果没有被检索过,则进行检索sets.add(num)queue.append([num,index+1])return -1

leetcode —— 752. 打开转盘锁相关推荐

  1. LeetCode 752. 打开转盘锁(图的BFS最短路径)

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

  2. LeetCode 752. 打开转盘锁 (C#实现)——队列,广度优先搜索

    一.代码实现 思路:使用先进先出的队列,广度优先搜索,使用字典可大幅减少遍历时间 问题:https://leetcode-cn.com/problems/open-the-lock/submissio ...

  3. leetcode 752. 打开转盘锁 c代码

    先看题目: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' . 每个拨轮可以自由旋转:例如 ...

  4. 血战力扣752.打开转盘锁

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

  5. leetcode 752. Open the Lock | 752. 打开转盘锁(BFS)

    题目 https://leetcode.com/problems/open-the-lock/ 题解 先写了个 DFS,超时了. 看了下 Related Topics,提示说应该是 BFS.这已经不是 ...

  6. 打开转盘锁 ,易懂的BFS解法

    打开转盘锁 LeetCode752 题目描述: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', ' ...

  7. 【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁

  8. 少听大忽悠的AI万能论:不打开四道锁,企业永远无法享用AI

    如果你是一位科技和AI爱好者,想必会在各种信息渠道看到"人工智能又能干什么了"."人工智能又在某领域超过人类了",这类消息近乎于每天都在我们的眼球前摇晃. 久而 ...

  9. 计算机游戏锁怎么打开,键盘锁打不开要怎么办呢【图文教程】

    每当我们清晨睁开眼的第一下就意识到今天还有很多事情要做,还有一大家子人靠我养活呢,马上就会投身于工作当中,在这么繁忙的工作中难免会忘记一些生活中的琐事,如地忘了拖, 被子 没有叠,钥匙忘了带,更严重的 ...

最新文章

  1. FTP、HTTP断点续传和多线程的协议基础
  2. 进击webpack4 (优化篇)
  3. 基于Visual Studio2010讲解C#4.0语法(5)--使用CollectionClasses
  4. DCMTK:OFvariant的单元测试
  5. P1742 最小圆覆盖
  6. [异常解决] How to build a gcc toolchain for nRF51 on linux (very detailed!!!)
  7. 程序员编程艺术第二十六章:基于给定的文档生成倒排索引(含源码下载)
  8. 好险!一入职,就遇到MySQL这么大Bug!差点背锅走人~
  9. usb通讯——读《圈圈教你玩usb》
  10. 工具DebugView、PCHunter、Procexp、Procmon
  11. c语言病房管理系统,病房全数字呼叫系统-医疗病房管理系统智能呼叫对讲系统...
  12. 批量修改图幅lisp_AutoCAD中自动批量修改图形文件的程序
  13. 示波器带宽定义与来源
  14. QQ点不开链接/空间/邮箱。提示:windows找不到文件
  15. 如何把bibtex的文献导入到endnote里面
  16. 考研数学-初数1主讲人:郑小松-2020年07月04日
  17. 如何进入大数据领域,学习路线是什么?
  18. 【IoT】创业:如何设计强有力的价值主张?
  19. UE4 3ds Max 模型多维子材质
  20. win7、win10连接到win10共享打印机出现0x0000011b错误

热门文章

  1. web项目部署详细步骤
  2. devexpress 主从表中从主、从表行列值的获得
  3. NodeJS同步MySQL上游数据到ElasticSearch数据库中
  4. Serverless 实战 —— 快速搭建 SpringBoot 应用
  5. 2018年12月份GitHub上最热门的Java开源项目
  6. Spring MVC Interceptor Handler InterceptorAdapter HandlerInterceptor示例
  7. 【11.18总结】从SAML出发在重定向中发现的XSS漏洞
  8. [ACTF2020 新生赛]Include
  9. react入门jsx
  10. 响应式编程 函数式编程_函数式编程的基本原理简介