普通版
package com.company;
import static java.lang.System.out;
import java.util.*;
public class Main {
public static String plusOne(String s, int j){
char[] ch = s.toCharArray();
if (ch[j] == '9')
ch[j] = '0';
else
ch[j] += 1;
return new String(ch);
}
public static String minusOne(String s, int j){
char[] ch = s.toCharArray();
if (ch[j] == '0')
ch[j] = '9';
else
ch[j] -= 1;
return new String(ch);
}
public static int openLock(String[] deadends, String target){
Set<String> deads = new HashSet<>();
for (String s: deadends) deads.add(s);
Set<String> visited = new HashSet<>();
Queue<String> q = new LinkedList<>();
int step = 0;
q.offer("0000");
visited.add("0000");
while (!q.isEmpty()){
int sz = q.size();
for (int i = 0; i < sz; i++) {
String cur = q.poll();
if (deads.contains(cur))
continue;
if (cur.equals(target))
return step;
for (int j = 0; j < 4; j++) {
String up = plusOne(cur, j);
if (!visited.contains(up)){
q.offer(up);
visited.add(up);
}
String down = minusOne(cur, j);
if (!visited.contains(down)){
q.offer(down);
visited.add(down);
}
}
}
step++;
}
return -1;
}
public static void main(String[] args) {
String[] deadends = {"8887", "8889", "8878", "8898", "8788", "8988", "7888", "9888"};
String target = "8888";
out.println(openLock(deadends, target));
}
}
优化1:将deads和visited合并
package com.company;
import static java.lang.System.out;
import java.util.*;
public class Main {
public static String plusOne(String s, int j){
char[] ch = s.toCharArray();
if (ch[j] == '9')
ch[j] = '0';
else
ch[j] += 1;
return new String(ch);
}
public static String minusOne(String s, int j){
char[] ch = s.toCharArray();
if (ch[j] == '0')
ch[j] = '9';
else
ch[j] -= 1;
return new String(ch);
}
public static int openLock(String[] deadends, String target){
Set<String> deads = new HashSet<>();
for (String s: deadends) deads.add(s);
Queue<String> q = new LinkedList<>();
int step = 0;
q.offer("0000");
deads.add("0000");
while (!q.isEmpty()){
int sz = q.size();
for (int i = 0; i < sz; i++) {
String cur = q.poll();
if (cur.equals(target))
return step;
for (int j = 0; j < 4; j++) {
String up = plusOne(cur, j);
if (!deads.contains(up)){
q.offer(up);
deads.add(up);
}
String down = minusOne(cur, j);
if (!deads.contains(down)){
q.offer(down);
deads.add(down);
}
}
}
step++;
}
return -1;
}
public static void main(String[] args) {
String[] deadends = {"8887", "8889", "8878", "8898", "8788", "8988", "7888", "9888"};
String target = "8888";
out.println(openLock(deadends, target));
}
}
双向BFS
package com.company;
import static java.lang.System.out;
import java.util.*;
public class Main {
public static String plusOne(String s, int j){
char[] ch = s.toCharArray();
if (ch[j] == '9')
ch[j] = '0';
else
ch[j] += 1;
return new String(ch);
}
public static String minusOne(String s, int j){
char[] ch = s.toCharArray();
if (ch[j] == '0')
ch[j] = '9';
else
ch[j] -= 1;
return new String(ch);
}
public static int openLock(String[] deadends, String target){
Set<String> deads = new HashSet<>();
for (String s: deadends) deads.add(s);
Set<String> q1 = new HashSet<>();
Set<String> q2 = new HashSet<>();
Set<String> visited = new HashSet<>();
q1.add("0000");
q2.add(target);
int step = 0;
while (!q1.isEmpty() && !q2.isEmpty()){
Set<String> temp = new HashSet<>();
for (String cur: q1){
if (deads.contains(cur))
continue;
if (q2.contains(cur))
return step;
visited.add(cur);
for (int j = 0; j < 4; j++) {
String up = plusOne(cur, j);
if (!visited.contains(up))
temp.add(up);
String down = minusOne(cur, j);
if (!visited.contains(down))
temp.add(down);
}
}
step++;
q1 = q2;
q2 = temp;
}
return -1;
}
public static void main(String[] args) {
String[] deadends = {"8887", "8889", "8878", "8898", "8788", "8988", "7888", "9888"};
String target = "8888";
out.println(openLock(deadends, target));
}
}
如果你认为对你有用,关注我的微信公众号支持我一下吧!~