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

752. 打开转盘锁

作者: 最困惑的时候就是能成长的时候 | 来源:发表于2019-08-12 19:26 被阅读0次

752. 打开转盘锁

1.想法

image.png

我们有以下结论:
1.每次维护一个已经到达的String,这些字符串这一步的位置,分别可以转动四个转盘,每个转盘可以顺时针和逆时针进行转动,所以每个字符串可以生成8个新的字符串.
2.我们维护一个已经到达的位置,对于已经到达的位置我们不再使用
3.这个位置必须还是不再死亡数字里面的

什么时候会返回-1

1.死亡数字为0000
2.target的周围都不能访问到 例如8888->(8887,8889),->(8898,8878),->(8988,8788),->(9888,7888)

Attention:
1.将数字char转为int 例将'1'转为1,那么为'1'-'0'
2.将int转为char 例将1转为'1',那么为(char)(1+'0')
3.将对数字0-9进行+1或-1后进行取模10运算为1.+1为(num+1)%10 2.-1为(num-1+10)%10因为,num-1可能会变成-1,所以需要+10
总结为:+1为(num+1)%10 -1为(num+9)%10

2.代码

class Solution {
      public int openLock(String[] deadends, String target) {
        HashSet<String> deadNo = new HashSet();   //死亡数字
        HashSet<String> usedStr = new HashSet<>(); //用过的数字
        for(String s:deadends){
            deadNo.add(s);
        }
        usedStr.add("0000");
        if(deadNo.contains("0000")||allGroudUsed(target,deadNo))return -1; //返回-1的情况
        int index = 0;
        List<String> forCheck = new ArrayList<>();
        forCheck.add("0000");
        while(index++<36){
            List<String> nextList = new ArrayList<>();    //广度搜索的下一个集合
            for(String item:forCheck){
                char[] chs = item.toCharArray();
                for(int i=0;i<4;i++){    //旋转4个转盘中的一个
                    char temp = chs[i];
                    chs[i] = (char) ((chs[i]-'0'+11)%10+'0');    //先顺时针
                    String strAdd = String.valueOf(chs);
                    if(!usedStr.contains(strAdd)&&!deadNo.contains(strAdd)){  //检测
                        usedStr.add(strAdd);
                        nextList.add(strAdd);
                        if(strAdd.equals(target))return index;
                    }
                    chs[i] = temp;
                    chs[i] = (char) ((chs[i]-'0'+9)%10+'0');    //逆时针方向旋转
                    String strSub = String.valueOf(chs);
                    if(!usedStr.contains(strSub)&&!deadNo.contains(strSub)){
                        usedStr.add(strSub);
                        nextList.add(strSub);
                        if(strSub.equals(target))return index;
                    }
                    chs[i] = temp;
                }
            }
            forCheck = nextList;
        }
        return -1;
    }

    private boolean allGroudUsed(String target, HashSet<String> deadNo) {  //判断是否周围都被使用
        if(deadNo.size()<8)return false;
        char[] chs = target.toCharArray();
        int count =0 ;
        for(int i=0;i<4;i++){
            char temp = chs[i];
            chs[i] = (char) ((chs[i]+1)%10);
            String str = String.valueOf(chs);
            if(!deadNo.contains(str))return false;
            chs[i] = temp;
            chs[i] = (char) ((chs[i]-1)%10);
            String str2 = String.valueOf(chs);
            if(!deadNo.contains(str2))return false;
            chs[i] = temp;
        }
        return true;
    }
}

相关文章

  • 752. 打开转盘锁

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

  • 752. 打开转盘锁

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

  • 752. 打开转盘锁(Python)

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

  • LeetCode 752. 打开转盘锁

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

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

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

  • leetcode-打开转盘锁

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

  • LeetCode 第752题:打开转盘锁

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

  • 2019-05-23打开转盘锁

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

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

  • 分享给你心底的秘密

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

网友评论

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

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