地址 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. 打开转盘锁-LMLPHP

05-14 17:42