Open the Lock
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; }