美文网首页
LeetCode 752. 打开转盘锁

LeetCode 752. 打开转盘锁

作者: 陈陈chen | 来源:发表于2021-10-01 14:45 被阅读0次

1、题目

image.png

2、分析

基本上直接套用BFS的算法框架就可以

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    Queue<Node> q; // 核心数据结构
    Set<Node> visited; // 避免走回头路
    
    q.offer(start); // 将起点加入队列
    visited.add(start);
    int step = 0; // 记录扩散的步数

    while (q not empty) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            Node cur = q.poll();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的下一步要都加入队列 */
            for (Node x : cur.adj())
                if (x not in visited) {
                    q.offer(x);
                    visited.add(x);
                }
        }
        /* 划重点:更新步数在这里 */
        step++;
    }
}

3、代码

class Solution {
    //某个轮盘加一
    public String up(String s, int i){
        char[] ch = s.toCharArray();
        if(ch[i] == '9'){
            ch[i] = '0';
        }
        else{
            ch[i] += 1;
        }
        return new String(ch);
    }
    //某个轮盘减一
    public String down(String s, int i){
        char[] ch = s.toCharArray();
        if(ch[i] == '0'){
            ch[i] = '9';
        }
        else{
            ch[i] -= 1;
        }
        return new String(ch);
    }

    public int openLock(String[] deadends, String target) {
        //队列
        Queue<String> queue = new LinkedList<>();
        //存储已经走过的节点,防止走回头路
        Set<String> visited = new HashSet<>();
        Set<String> deadSet = new HashSet<>();
        for(String s : deadends) deadSet.add(s);
        queue.offer("0000");
        visited.add("0000");
        int times = 0;
        while(!queue.isEmpty()){
            int size = queue.size();
            //遍历这一步所有的结果
            for(int i = 0; i < size; i++){
                String cur = queue.poll();
                //找到结果,或者包含在死锁中
                if(deadSet.contains(cur)) continue;
                if(cur.equals(target)) return times;
                //某一个结果,下一步有哪几种可能都列出来,加到队列中
                for(int j = 0; j < 4; j++){
                    String up = up(cur, j);
                    if(!visited.contains(up)){
                        queue.offer(up);
                        visited.add(up);
                    }
                    String down = down(cur, j);
                    if(!visited.contains(down)){
                        queue.offer(down);
                        visited.add(down);
                    }
                }
            }
            //步数加一
            times++;
        }
        return -1;
    }
}

相关文章

  • LeetCode 752. 打开转盘锁

    1、题目 2、分析 基本上直接套用BFS的算法框架就可以 3、代码

  • 752. 打开转盘锁

    752. 打开转盘锁 1.想法 我们有以下结论:1.每次维护一个已经到达的String,这些字符串这一步的位置,分...

  • 752. 打开转盘锁

    你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5...

  • 752. 打开转盘锁(Python)

    难度:★★★☆☆类型:图方法:宽度优先搜索 力扣链接请移步本题传送门[https://leetcode-cn.co...

  • 752. 打开转盘锁(仅思路)

    思路:广度优先搜索 关键点: 如何把死亡数字转换成入队时的判断条件 如何获取下一组可以调整的数字(地位等同于广度搜...

  • leetcode-打开转盘锁

    这道题估计在让我做一次,我还是做不出来的,想不到,且不好理解。 这道题用了BFS,广度优先搜索。利用queue队列...

  • LeetCode 第752题:打开转盘锁

    1、前言 2、思路 主要思路使用 BFS。锁有四个位置,从 “0000” 开始,每个位置如果只转一下,分为向上转跟...

  • 2019-05-23打开转盘锁

  • 2019-02-25 goland实现打开转盘锁

    题目: 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字:'0', '1', '2', '3', '4',...

  • 分享给你心底的秘密

    我生日那天,朋友很有兴致的送我一把钥匙,锁呢?他从床头的橱柜拿出一个盒子。打开,里面却又有转盘的密码。知道密码吗我...

网友评论

      本文标题:LeetCode 752. 打开转盘锁

      本文链接:https://www.haomeiwen.com/subject/vtrunltx.html