2018-07-15 10:33:46
问题描述:

问题求解:
其实是一个解空间遍历的问题,每个节点可以扩展8条边,由此问题变成了图中的最短路径问题,由于本题中路径长度为1,所以最高效的解法就是使用BFS进行层次遍历。
想到使用图来做其实问题已经就解决的一大半,剩下的基本就是宽搜的模板了。
public int openLock(String[] deadends, String target) {
Queue<String> queue = new LinkedList<>();
HashSet<String> set = new HashSet<String>(Arrays.asList(deadends));
queue.add("0000");
int step = -1;
while (!queue.isEmpty()) {
int size = queue.size();
step++;
for (int i = 0; i < size; i++) {
String cur = queue.poll();
if (set.contains(cur)) continue;
if (cur.compareTo(target) == 0) return step;
set.add(cur);
for (int j = 0; j < 4; j++) {
for (int k = -1; k < 2; k += 2) {
char[] temp = cur.toCharArray();
temp[j] = (char)((temp[j] - '0' + k + 10) % 10 + '0');
queue.add(new String(temp));
}
}
}
}
return -1;
}