地址 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。

示例 :

输入:deadends = ["","","","",""], target = ""
输出:
解释:
可能的移动序列为 "" -> "" -> "" -> "" -> "" -> "" -> ""。
注意 "" -> "" -> "" -> "" -> "" 这样的序列是不能解锁的,
因为当拨动到 "" 时这个锁就会被锁定。
示例 : 输入: deadends = [""], target = ""
输出:
解释:
把最后一位反向旋转一次即可 "" -> ""。
示例 : 输入: deadends = ["","","","","","","",""], target = ""
输出:-
解释:
无法旋转到目标数字且不被锁定。
示例 : 输入: deadends = [""], target = ""
输出:-
  提示: 死亡列表 deadends 的长度范围为 [, ]。
目标数字 target 不会在 deadends 之中。
每个 deadends 和 target 中的字符串的数字会在 , 个可能的情况 '' 到 '' 中产生。

题解 BFS 宽度优先搜索 可以更快的找到 最短路径

然后就是BFS的框架 需要注意的小细节有两点

1 使用哈希而不是vector 进行deadends的比对

2 一旦搜索到目标就可以退出

代码

class Solution {
public: queue<string> q;
int visit[];
int g_ret =-;
string g_target; void bfdInner(string& s, int count, unordered_set<string>& deadends)
{
if(deadends.count(s) != ) return; if(s == g_target) {
g_ret = count;
return;
} int num = atoi(s.c_str());
if (visit[num] > count) {
visit[num] = count;
q.push(s);
}
} void bfs(string& s, int count, int idx, unordered_set<string>& deadends)
{
string s1 = s, s2 = s;
if(g_ret != - ) return; if (s[idx] == '') { s1[idx] = ''; s2[idx] = ''; }
else if (s[idx] == '') { s1[idx] = ''; s2[idx] = ''; }
else { s1[idx]++; s2[idx]--; } bfdInner(s1, count, deadends);
bfdInner(s2, count, deadends); } int openLock(vector<string>& deadends, string target) { for (int i = ; i < ; i++) {
visit[i] = ;
}
unordered_set<string> deadlock(deadends.begin(), deadends.end()); g_target = target; string start = "";
if(deadlock.count("") != ) return -; visit[] = ;
q.push(start); //bfs
while (!q.empty()) {
string numStr = q.front();
q.pop(); int count = visit[atoi(numStr.c_str())]; for (int i = ; i < ; i++) {
bfs(numStr, count + , i, deadlock);
} } return g_ret;
} };

leetcode 752. 打开转盘锁的更多相关文章

  1. Java实现 LeetCode 752 打开转盘锁(暴力)

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

  2. Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)

    Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

  3. LeetCode 752:打开转盘锁 Open the Lock

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

  4. [LeetCode] 0752. Open the Lock 打开转盘锁

    题目 You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', ' ...

  5. [Swift]LeetCode752. 打开转盘锁 | Open the Lock

    You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...

  6. leetcode752. 打开转盘锁

    我们可以将 0000 到 9999 这 10000 状态看成图上的 10000 个节点,两个节点之间存在一条边,当且仅当这两个节点对应的状态只有 1 位不同,且不同的那位相差 1(包括 0 和 9 也 ...

  7. [LeetCode] 752. Open the Lock 开锁

    You have a lock in front of you with 4 circular wheels. Each wheel has 10 slots: '0', '1', '2', '3', ...

  8. LeetCode 752. Open the Lock

    原题链接在这里:https://leetcode.com/problems/open-the-lock/ 题目: You have a lock in front of you with 4 circ ...

  9. 4、BFS算法套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

随机推荐

  1. C# List与Dictionary相互转换与高效查找

    TestModel类定义: public class TestModel{    public int Id { get; set; }    public string Name { get; se ...

  2. PlayJava Day023

    进程:进程是程序的一次动态执行过程,它经历了从代码加载.执行到执行完毕的一个完整过程,这个过程也是进程本身从产生.到发展到最终消亡的过程 多进程:多进程操作系统能同时运行多个进程(程序) 多线程:是指 ...

  3. Java生鲜电商平台-统一格式返回的API架构设计与实战

    Java生鲜电商平台-统一格式返回的API架构设计与实战 说明:随着互联网各岗位精细化分工的普及,出现了很多的系统架构设计,比如常见的前后端分离架构,后端提供接口给前端,前端根据接口的数据进行渲染,大 ...

  4. Angular(04)-知识点脑图

    点击左键 => 拖拽图片 => 新标签页查看图片 => 放大拖拽查阅

  5. FlowPortal 6.00c 使用xFormDesigner复制粘贴中文总是乱码

    环境: Windows Server 2016中文版 FlowPortal 6.00C 问题: 使用xFormDesigner 在源码选项卡复制粘贴中文总是乱码. 解决办法: 控制面板---区域--- ...

  6. Unity《ATD》塔防RPG类3D游戏架构设计(一)

    目录 <ATD> 游戏简介 <ATD> 整体结构 <ATD> 游戏机制 Buff机制 Skill机制(技能机制) 仇恨机制 <ATD> 游戏模型 策划案 ...

  7. python与数据库交互的模块pymysql

    一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...

  8. nlp英文的数据清洗代码

    1.常用的清洗方式 #coding=utf-8 import jieba import unicodedata import sys,re,collections,nltk from nltk.ste ...

  9. BitMap原理

    BitMap原理  

  10. 剑指Offer-44.翻转单词顺序列(C++/Java)

    题目: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student. ...