你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有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 {
public:int openLock(vector<string>& deadends, string target) {// 哈希表vis中存储不可能入队的结点,包括deadends和已访问过的结点unordered_set<string> vis;vis.insert(deadends.begin(), deadends.end()); if(vis.count("0000")) return -1;int step = 0;queue<string> st;st.push("0000");while(!st.empty()){            int length = st.size();for(int i = 0; i < length; i++){string curr = st.front();st.pop();// 找到目标元素,直接返回答案if(curr == target)return step;// 处理curr周围的八个相邻结点for(int j = 0; j < 4; ++j){// 自增1与自减1for(int t = -1; t < 2; t += 2){// 完美的字符处理方式,利用ascⅡ码之差之后加上t并取余作为新得到的整型,然后再加上0的ascⅡ码值返回字符char a = (curr[j] -'0' + 10 + t) % 10 + '0';string newOne = curr;newOne[j] = a;// 若哈希集中找不到此状态,则加入哈希集同时入队if(!vis.count(newOne)){st.push(newOne);vis.emplace(newOne);}}                 }}// 本层队列中元素处理完成,到达下一转动步数,步数加1step++;}return -1;}
};

血战力扣752.打开转盘锁相关推荐

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

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

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

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

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

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

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

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

  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. 血战力扣 332.零钱兑换

    题目: 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额. 计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组合能组成总金额,返回 - ...

  9. 力扣OJ 剑指 Offer II

    目录 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 004. ...

最新文章

  1. 160个Crackme032用ProcessMonitor拆解KeyFile保护
  2. Vue实现Todo List
  3. php父类继承子类_php有多态吗 多态都有什么好处?理解好多态往往能事半功倍...
  4. CAP 2.4版本发布,支持版本隔离特性
  5. AC-DC电源模块怎么选择?有哪些注意事项?
  6. Linux中Oracle的sqlplus下退格和Del键无效的问题解决
  7. 2038: [2009国家集训队]小Z的袜子(hose)
  8. ORACLE expdp/impdp导出实例
  9. Neuron:Neural activities in V1 create a bottom-up saliency map
  10. 13、XSI,信号量简介
  11. bat自动输入密码_如何给电脑文件夹设置密码?一学就会
  12. linux如何停止命令运行,linux的停止命令
  13. Brooklyn 2.1.0 (60+超炫苹果标志动画屏保)
  14. 用c语言编写字母循环,C语言输入循环字母
  15. 史上最全的Python定量金融三方库汇总
  16. Java通过SMS短信平台实现发短信功能
  17. MATLAB 3D玫瑰花绘制(内附旋转版本)
  18. HRBUST 1849 商品中心
  19. 《胡闹厨房2》Overcooked 2 for Mac v2.0 烹饪模拟游戏
  20. 车牌号对应的城市建表SQL文件

热门文章

  1. uniapp实现微信登录或者QQ登录
  2. 英文论文写作摘要的时态和语态
  3. Azure认证 Administrator Associate(AZ-104) 考试指南,资料分享
  4. Android开发5年,面试问到底层实现原理,被怼得,程序员中年危机
  5. On the Factory Floor: ML Engineering for Industrial-Scale Ads Recommendation Models笔记
  6. 《华为区块链白皮书》重磅发布(4大类应用场景/5分钟上链/)
  7. 求选修了学号为“95001”学生所学过的所有课程的学生学号和姓名
  8. STM32F10x单片机Flash写操作导致中断不响应问题
  9. 求大佬指点,什么是内部异常堆栈跟踪的结尾?
  10. ISIS报文格式—LSP