BFS算法
import java.util.*;
public class Solution {
public int open (ArrayList<String> vec, String tar) {
//记录非法密码
Set<String> deadPassword = new HashSet<>();
for(String s:vec){
deadPassword.add(s);
}
//记录已经穷举过的密码,防止重复
Set<String> visited = new HashSet<>();
Queue<String> q = new LinkedList<>();
q.offer("0000");
int step = 0;
visited.add("0000");
while(!q.isEmpty()){
int size = q.size();
for(int i = 0;i<size;i++){
String cur = q.poll();
if(deadPassword.contains(cur)){
continue;
}
if(cur.equals(tar)){
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;
}
//向上拨动一位
private String plusOne(String s,int i){
char[] ch = s.toCharArray();
if(ch[i] == '9'){
ch[i] = '0';
}else{
ch[i] += 1;
}
return new String(ch);
}
//向下拨动一位
private String minusOne(String s,int i){
char[] ch = s.toCharArray();
if(ch[i] == '0'){
ch[i] = '9';
}else{
ch[i] -= 1;
}
return new String(ch);
}
}