题:https://leetcode.com/problems/open-the-lock/
题目大意
有一个锁,上的有四个数,每个数可以循环转动从0-9,同时若锁上的数转为 deadends 中的元素时,锁会坏掉。每转一下,视为 一个 move,求将锁从 0000,转为 target的最小move。
思路
无向图的 搜索,使用 bfs,这里需要注意的是,对string的 任意位 改变 时,将 string 转化为 char[] 会更方便。
class Solution {
public int openLock(String[] deadends, String target) {
Queue<String> queue = new LinkedList();
Set<String> deadendsSet = new HashSet();
Set<String> hasVisitedSet = new HashSet();
for(String deadend : deadends)
deadendsSet.add(deadend);
int moves = 0;
String startLock = "0000";
if(deadendsSet.contains(startLock))
return -1;
if(startLock.equals(target))
return moves;
hasVisitedSet.add(startLock);
queue.add(startLock);
int a =0;
while(!queue.isEmpty()){
int queueLen = queue.size();
moves ++ ;
while(queueLen-- > 0){
char[] curChs = queue.poll().toCharArray();
for(int i = 0 ; i < 4 ; i++){
int curVal = curChs[i] - '0';
curChs[i] = (char) ('0' +((curVal+10+1)%10));
String oneMoveString1 = new String(curChs);
curChs[i] = (char) ('0' +((curVal+10-1)%10));
String oneMoveString2 = new String(curChs);
curChs[i] = (char)(curVal + '0');
if(!hasVisitedSet.contains(oneMoveString1) && !deadendsSet.contains(oneMoveString1)){
if(oneMoveString1.equals(target))
return moves;
queue.add(oneMoveString1);
hasVisitedSet.add(oneMoveString1);
}
if(!hasVisitedSet.contains(oneMoveString2)&&!deadendsSet.contains(oneMoveString2)){
if(oneMoveString2.equals(target))
return moves;
queue.add(oneMoveString2);
hasVisitedSet.add(oneMoveString2);
}
}
}
}
return -1;
}
}