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。
示例 : 输入: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. 打开转盘锁的更多相关文章
- Java实现 LeetCode 752 打开转盘锁(暴力)
752. 打开转盘锁 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋 ...
- Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)
Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
- LeetCode 752:打开转盘锁 Open the Lock
题目: 你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 ' ...
- [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', ' ...
- [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', ...
- leetcode752. 打开转盘锁
我们可以将 0000 到 9999 这 10000 状态看成图上的 10000 个节点,两个节点之间存在一条边,当且仅当这两个节点对应的状态只有 1 位不同,且不同的那位相差 1(包括 0 和 9 也 ...
- [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', ...
- LeetCode 752. Open the Lock
原题链接在这里:https://leetcode.com/problems/open-the-lock/ 题目: You have a lock in front of you with 4 circ ...
- 4、BFS算法套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...
随机推荐
- C# List与Dictionary相互转换与高效查找
TestModel类定义: public class TestModel{ public int Id { get; set; } public string Name { get; se ...
- PlayJava Day023
进程:进程是程序的一次动态执行过程,它经历了从代码加载.执行到执行完毕的一个完整过程,这个过程也是进程本身从产生.到发展到最终消亡的过程 多进程:多进程操作系统能同时运行多个进程(程序) 多线程:是指 ...
- Java生鲜电商平台-统一格式返回的API架构设计与实战
Java生鲜电商平台-统一格式返回的API架构设计与实战 说明:随着互联网各岗位精细化分工的普及,出现了很多的系统架构设计,比如常见的前后端分离架构,后端提供接口给前端,前端根据接口的数据进行渲染,大 ...
- Angular(04)-知识点脑图
点击左键 => 拖拽图片 => 新标签页查看图片 => 放大拖拽查阅
- FlowPortal 6.00c 使用xFormDesigner复制粘贴中文总是乱码
环境: Windows Server 2016中文版 FlowPortal 6.00C 问题: 使用xFormDesigner 在源码选项卡复制粘贴中文总是乱码. 解决办法: 控制面板---区域--- ...
- Unity《ATD》塔防RPG类3D游戏架构设计(一)
目录 <ATD> 游戏简介 <ATD> 整体结构 <ATD> 游戏机制 Buff机制 Skill机制(技能机制) 仇恨机制 <ATD> 游戏模型 策划案 ...
- python与数据库交互的模块pymysql
一.Mysql 1.前提 pip install pymysql import pymysql 2.详情 Connection对象 =====>用于连接数据库 用于建立与数据库的连接 创建对象: ...
- nlp英文的数据清洗代码
1.常用的清洗方式 #coding=utf-8 import jieba import unicodedata import sys,re,collections,nltk from nltk.ste ...
- BitMap原理
BitMap原理
- 剑指Offer-44.翻转单词顺序列(C++/Java)
题目: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student. ...