打开转盘锁 Open the Lock
有一个带4个圆形转轮的转盘锁,每个转轮有10个数字 0-9,转轮可以自由转。每次旋转只能转一个转轮的一个数字。
初始数字为0000
,一个代表4个转轮数字的字符串。
列表deadends
标识了一组死亡数字,一旦转轮转到了这个列表中的任何数字,锁就无法再次转动,被永久锁定。
字符串target代表可以解锁的数字,求解锁需要的最小旋转次数,否则返回-1.
deadends = ["0201","0101","0102","1212","2002"], target = "0202"
out:6
思路
使用BFS
,4个转轮,每次只能动一个转轮, 一个转轮一次动一位。
处理数字要注意
public class Data{
String s;
int v;
Data(String str, int val){
s= str;
v = val;
}
}
public String getStr(String str ,int i,int j){
char[] arr = str.toCharArray();
switch(j){
case 0:
arr[i]-=1;
break;
case 1:
arr[i]+=1;
break;
};
if(arr[i]<'0'){
arr[i]='9';
}
if(arr[i]>'9'){
arr[i]='0';
}
return new String(arr);
}
public int openLock(String[] deadends, String target) {
HashSet<String> set = new HashSet<String>();
for(int i=0;i<deadends.length;i++){
set.add(deadends[i]);
}
Queue<Data> queue = new LinkedList<Data>();
if(set.contains("0000")){
return -1;
}
queue.offer(new Data("0000",0));
set.add("0000");
while(!queue.isEmpty()){
Data t = queue.peek();
if(target.equals(t.s)){
return t.v;
}
for(int i =0;i<4;i++){
for(int j=0;j<2;j++){
String s = getStr(t.s,i,j);
if(set.contains(s)){
continue;
}
set.add(s);
queue.offer(new Data(s,t.v+1));
}
}
queue.poll();
}
return -1;
}
Tag
BFS