> For the complete documentation index, see [llms.txt](https://shangan.gitbook.io/gong-kai-ke/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://shangan.gitbook.io/gong-kai-ke/di-er-zhang-bfs/ke-hou-lian-xi/untitled-2.md).

# Open the Lock

![](https://gblobscdn.gitbook.com/assets%2F-MQQ_aKuDz0ArQY9xrTi%2F-MQQ_hCHEF_NfTLb7c5f%2F-MQQhK6lAaBSDTrKohkL%2FWechatIMG22.png?alt=media\&token=90bc890e-7a68-4f04-84cc-c23bbda959bd)

```java
/*
 本算法答案由上岸科技提供。
 上岸科技是一个专致力于高效培养北美留学生拥有实际面试能力的团体。
 我们采用小班化线上，线下教学让学生更快，更好的学习到想要的知识。
 团队主要由一群怀揣情怀于美国高校毕业的一线IT公司工程师构成。
 我们坚信对于求职者算法并不是全部，合理的技巧加上适当的算法培训能够大大的提升求职成功概率也能大大减少刷题的痛苦。
 正如我们的信仰：我们教的是如何上岸而不仅是算法。
 更多信息请关注官网：https://www.shanganonline.com/
*/
class Solution {
    
    private static final String START = "0000";
    public int openLock(String[] deadends, String target) {
        Set<String> set = new HashSet<>(Arrays.asList(deadends));
        if (set.contains(START)) {
            return -1;
        }
        
        Queue<String> queue = new ArrayDeque<>();
        queue.offer(START);
        set.add(START);
        int level = 0;
        
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                String current = queue.poll();
                if (target.equals(current)) {
                    return level;
                }

                for (String next : nextLocks(current)) {
                    if (!set.contains(next)) {
                        set.add(next);
                        queue.offer(next);
                    }
                }
            }
            level++;
        }
        
        return -1;
    }
    
    private List<String> nextLocks(String lock) {
        List<String> locks = new ArrayList<>();
        char[] arr = lock.toCharArray();
        char c;
        for (int i = 0; i < arr.length; i++) {
            c = arr[i];
            arr[i] = c == '9' ? '0' : (char) (c + ((char) 1));
            locks.add(new String(arr));
            
            arr[i] = c == '0' ? '9' : (char) (c - ((char) 1));
            locks.add(new String(arr));
            
            arr[i] = c;
        }
        return locks;
    }
}
```

![](https://gblobscdn.gitbook.com/assets%2F-MQQ_aKuDz0ArQY9xrTi%2F-MQQ_hCHEF_NfTLb7c5f%2F-MQQhNaEDp_XdzFm0Ypp%2FWechatIMG23.png?alt=media\&token=0eec3fd8-70e7-4ac4-93e9-6cec19015bdb)
