题目

https://leetcode.com/problems/open-the-lock/

题解

先写了个 DFS,超时了。

看了下 Related Topics,提示说应该是 BFS。这已经不是第一次遇到 BFS 可以、DFS 超时的题目了。

总结了一下,对于这种可以用 DFS/BFS 求最短路径的题目,优先选择 BFS,因为你到达目标的可能性有超级多种,而大多数路线都走了很多弯路,去遍历它们都是无用功。用 BFS 的话,从 step=1 开始逐渐递增,在 step 受限的情况下,只要到达了目标,当前 step 一定是最短的 step。

另外,本题可以使用 智能算法(只是想到了,没有尝试过)(遗传/蚁群) / 启发式搜索(答案提到了,例如 A*)来做,作为拓展思路,本文不作实现。

class Solution {public int openLock(String[] deadends, String target) {int t = Integer.parseInt(target);Set<Integer> block = new HashSet<>();for (String s : deadends) {block.add(Integer.parseInt(s));}Set<Integer> seen = new HashSet<>();Stack<Integer> stack = new Stack<>();stack.push(0);int step = 0;while (!stack.isEmpty()) {Stack<Integer> nextStack = new Stack<>();while (!stack.isEmpty()) {int cur = stack.pop();if (cur == t) return step;if (block.contains(cur) || seen.contains(cur)) continue;seen.add(cur);nextStack.add(move(cur, 0, true));nextStack.add(move(cur, 0, false));nextStack.add(move(cur, 1, true));nextStack.add(move(cur, 1, false));nextStack.add(move(cur, 2, true));nextStack.add(move(cur, 2, false));nextStack.add(move(cur, 3, true));nextStack.add(move(cur, 3, false));}step++;stack = nextStack;}return -1;}public int move(int cur, int index, boolean front) {int[] arr = new int[4];int i = 3;while (cur != 0) {arr[i] = cur % 10;cur /= 10;i--;}arr[index] = front ? ((arr[index] + 1) + 10) % 10 : ((arr[index] - 1) + 10) % 10;int result = 0;for (int j = 0; j < 4; j++) {result *= 10;result += arr[j];}return result;}
}

leetcode 752. Open the Lock | 752. 打开转盘锁(BFS)相关推荐

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

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

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

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

  3. leetcode —— 752. 打开转盘锁

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

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

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

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

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

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

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

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

  8. 在JavaScript中判断键盘的大写锁定键(Caps Lock)是否打开(附扫描枪相关规则)

    1,在按钮中配置onkeypress <input name='test' onkeypress ="testCapsLock(event)" /> 2,在JavaSc ...

  9. MySQL 锁的相关知识 | lock与latch、锁的类型、简谈MVCC、锁算法、死锁、锁升级

    文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开 lock 和 la ...

最新文章

  1. SQL用于更新ID为顺序ID(用于删除了几条数据导致id不连续)
  2. 为什么到处都在推python_Python为什么能取得越来越超然的地位
  3. java将mysql数据写入到txt_java 追加写入数据到txt
  4. 理解lambda在linq中的应用
  5. python对seo有什么用_现在做seo会运用到python吗
  6. 豆瓣评分 9.7,等了好久的《操作系统导论》Operating Systems 终于来了
  7. java 数组协变_java 数组协变
  8. 利用 Finder 清理Mac旧档案,释放空间
  9. DB2 9 根本(730 检修)认证指南,第 6 局部: 数据并发性(2)
  10. HDU 1230解题报告
  11. php soapenv:server.userexception,SoapFault - faultcode: 'soap:Server' faultstring
  12. 相机标定中的四个坐标系
  13. Windows下CURL编译 支持HTTPS
  14. SEC再收中国互金企业招股书 融360成立简普科技拟融资2亿美元
  15. Git GitHub Gitee使用方法
  16. 数字IC设计随笔之二(VCS、DVE|Verdi单步调试)
  17. 纸壳CMS主题增强,支持主题中加入模板
  18. Arduino - 摇杆模块
  19. 第 304 场力扣周赛
  20. 移动端H5如何调用相册和相机上传图片、音频、视频

热门文章

  1. 2020CCPC(威海) - Clock Master(数论+分组背包)
  2. 牛客多校10 - Tournament(找规律)
  3. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)
  4. 洛谷 - P1361 小M的作物(最大流最小割)
  5. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
  6. PAT (Advanced Level) 1016 Phone Bills(恶心模拟)
  7. html css 画五角星,纯 CSS3 绘制图形(心形、五角星、六边形等)
  8. Linux系统CUDA10.2+CUDNN安装教程
  9. 梅州有学java的地方吗,梅州java工资水平,梅州java工资很高吗,梅州java工资底薪能到多少...
  10. 0x5f3759df的数学原理