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;
    }
原文地址:https://www.cnblogs.com/hyserendipity/p/9312134.html