752. 打开转盘锁

Posted 不吐西瓜籽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了752. 打开转盘锁相关的知识,希望对你有一定的参考价值。

算法记录

LeetCode 题目:

  你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。



说明

一、题目

  锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。
  列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。
  字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。

二、分析

  • 隐式的迷宫求解问题, 按照状态来区分有八种, 四个位数上的两种变化.
  • 注意剪枝的情况判定.
class Solution {
    class State{
        String value;
        int distance;
        public State(String value, int distance)  {
            this.value = value;
            this.distance = distance;
        }
    }
    public int openLock(String[] deadends, String target) {
        Queue<State> queue = new ArrayDeque();
        Set<String> visit = new HashSet();
        for(String s : deadends) visit.add(s);
        if(visit.contains("0000")) return -1;
        queue.add(new State("0000", 0));
        visit.add("0000");
        while(!queue.isEmpty()) {
            State state = queue.poll();
            if(target.equals(state.value)) return state.distance;
            for(int i = 0; i < 4; i++) {
                for(int j = -1; j < 2; j+=2) {
                    String ret = changeStatus(state.value, i, j);
                    if(visit.contains(ret)) continue;
                    visit.add(ret);
                    queue.add(new State(ret, state.distance + 1));
                }
            }
        }
        return -1;
    }

    private String changeStatus(String original, int index, int flag) {
        StringBuilder builer = new StringBuilder(original);
        char temp = builer.charAt(index);
        temp = (char)(temp + flag);
        if(temp > '9') temp = '0';
        if(temp < '0') temp = '9';
        builer.setCharAt(index, temp);
        return builer.toString();
    }
}

总结

熟悉广搜算法实现。

以上是关于752. 打开转盘锁的主要内容,如果未能解决你的问题,请参考以下文章

记一次队列和广度优先搜索问题(Leetcode.752 打开转盘锁)

LeetCode 752. 打开转盘锁 / 127. 单词接龙 / 773. 滑动谜题(学习双向BFS,A*算法)

LeetCode 752. 打开转盘锁

搜索

数据结构与算法之深入解析“打开转盘锁”的求解思路与算法示例

算法小抄题目(按章节)