问题:
给你一个包含四个环形转轮的密码锁,每个转轮上
1
0个格子对应从
‘
0
‘
到
‘9’
的1
0
个数字。这些转轮可以向两个方向自由转动,也就是可以从
‘
0
‘
转到
‘9’
,也可以从
‘9’
转到
‘
0
‘
。每一步你只可以转一个转轮一格。这个密码锁还有一些死锁状态
(
输入的
deadends)
,当四个转轮的密码转入这些状态时这个锁就再也打不开了。假设这个锁的初始状态是
“
0000
“
,给你一个目标状态
target
,请问你至少需要多少步才能够打开?如果不可能打开该密码锁,则输出-
1
。
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
if (dead.contains(init) || dead.contains(target)) {
return -1;
}
Queue<String> queue1 = new LinkedList<>();
Queue<String> queue2 = new LinkedList<>();
int steps = 0;
queue1.offer(init);
while (!queue1.isEmpty()) {
String cur = queue1.poll();
if (cur.equals(target)) {
return steps;
}
List<String> nexts = getNexts(cur);
for (String next : nexts) {
if (!dead.contains(next) && !visited.contains(next)) {
visited.add(next);
queue2.offer(next);
}
}
if (queue1.isEmpty()) {
steps++;
queue1 = queue2;
queue2 = new LinkedList<>();
}
}
return -1;
}
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
if (dead.contains(init) || dead.contains(target)) {
return -1;
}
if (target.equals(init)) {
return 0;
}
Set<String> set1 = new HashSet<>();
set1.add(init);
Set<String> set2 = new HashSet<>();
set2.add(target);
int steps = 0;
while (!set1.isEmpty() && !set2.isEmpty()) {
if (set1.size() > set2.size()) {
Set<String> temp = set1;
set1 = set2;
set2 = temp;
}
Set<String> set3 = new HashSet<>();
for (String cur : set1) {
for (String next : getNexts(cur)) {
if (set2.contains(next)) {
return steps + 1;
}
if (!dead.contains(next) && !visited.contains(next)) {
visited.add(next);
set3.add(next);
}
}
}
steps++;
set1 = set3;
}
return -1;
}
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp
ortant; word-wrap: break-word !imp