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算法文章,为了便于下载和整理,都已开源放在 ...
随机推荐
- ABAP里SELECT的用法汇总(转)
通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存.一.SELECT语句:1)SELECT用于确定读取数据表中的哪些字段:2)FROM子句用于确定从哪些内表或者视图中读取数据:3 ...
- Android TitleBar推荐
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/206 Android TitleBar推荐 这段时间在帮别 ...
- Rsync实现文件的同步
故事背景:我们公司是做新零售的,需要对发布的每台机器进行文件的同步更新,所以我这里做了一个小小的调研 技术调研:linux之间同步文件有两种方式rsync与scp. sync和scp在文件夹均不存在时 ...
- Redis基础类型常用操作命令
Redis基础类型常用操作命令 概念:Redis是用C语言开发的一个开源的高性能键值对数据库. 特征: 数据间没有必然的联系 内部采用单线程机制进行工作 高性能 多数据类型支持 字符串类型 Strin ...
- 表单生成器(Form Builder)之mongodb表单数据查询——关联查询
这一篇接着记录一下查询相关的操作.想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理.车辆.耗损.营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询.m ...
- Vm虚拟机最小化安装linux并配置NAT网络连接(全图)
- 07-Node.js学习笔记-路由
路由 http://localhost:3000/index http://localhost:3000/login //路由是指客户端请求地址与服务器端程序代码的对应关系.简单的说,就是请求什么响应 ...
- Java Swing 图形界面开发
https://blog.csdn.net/xietansheng/article/details/72814492
- hibernate-positional-parameter-does-not-exist-1-in-query
经过bug的排查,问题出在,scsj字段的赋值上; 通过字符串在数据库端生成即可:
- 将vue项目部署在Linux的Nginx下,并设置为局域网内访问
1. 下载 wget http://nginx.org/download/nginx-1.12.2.tar.gz 2. 解压缩 tar -zxvf linux-nginx-1.12.2.tar.gz ...