解题思路
1.bfs基本的框架
2.不能走回头路
3.判断是否转到了死亡数字
4.判断是否转到了正确数字
5.需要保证每个位子上的数字向上向下转的情况都产生
能完成以上五点这道题基本上就解决了
代码
class Solution {
public int openLock(String[] deadends, String target) {
Set<String> words = new HashSet<>();
for (int i=0;i<deadends.length;i++){
words.add(deadends[i]);
}
if (words.contains("0000")) return -1;
Set<String> check = new HashSet<>();
String begin = "0000";
LinkedList<String> queue = new LinkedList<>();
queue.add(begin);
check.add(begin);
int ans = 0;
while (!queue.isEmpty()){
int n = queue.size();
for (int i=0;i<n;i++){
String temp = queue.getFirst();
queue.removeFirst();
if (words.contains(temp)) continue;
if (temp.equals(target)) return ans;
for (int j=0;j<4;j++){//每个地方转一次
String strplus = plusOne(temp,j);//向上转
String strminus = minusOne(temp,j);//向下转
if (!check.contains(strplus)){
queue.add(strplus);
check.add(strplus);
}
if (!check.contains(strminus)){
queue.add(strminus);
check.add(strminus);
}
}
}
ans++;
}
return -1;
}
// 将 s[j] 向上拨动一次
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);
}
// 将 s[i] 向下拨动一次
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);
}
}