zoukankan      html  css  js  c++  java
  • 752. 打开转盘锁 BFS 最短路径

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

    锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。

    列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。

    字符串 target 代表可以解锁的数字,你需要给出最小的旋转次数,如果无论如何不能解锁,返回 -1。

    示例 1:
    
    输入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"
    输出:6
    解释:
    可能的移动序列为 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。
    注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的,
    因为当拨动到 "0102" 时这个锁就会被锁定。
    示例 2:
    
    输入: deadends = ["8888"], target = "0009"
    输出:1
    解释:
    把最后一位反向旋转一次即可 "0000" -> "0009"。
    示例 3:
    
    输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
    输出:-1
    解释:
    无法旋转到目标数字且不被锁定。
    示例 4:
    
    输入: deadends = ["0000"], target = "8888"
    输出:-1
    
    提示:
    
    死亡列表 deadends 的长度范围为 [1, 500]。
    目标数字 target 不会在 deadends 之中。
    每个 deadends 和 target 中的字符串的数字会在 10,000 个可能的情况 '0000' 到 '9999' 中产生。
    
    from collections import deque
    # 最短路径
    class Solution:
        def openLock(self, deadends: List[str], target: str) -> int:
            # 每次改变一位,-1或+1
            def neighbors(node):
                for i in range(4):
                    inode = int(node[i])
                    for j in (-1, 1):
                        x = (inode + j) % 10
                        yield node[:i] + str(x) + node[i + 1:]
            
            dead = set(deadends) # 将其变为集合,便于去重
            seen = set("0000")  # 转盘锁显示过的组合
            queue = deque([("0000", 0)])
            while queue:
                node, steps = queue.popleft()
                if node == target:
                    return steps
                if node not in dead:
                    for x in neighbors(node):
                        if x not in seen:
                            queue.append((x, steps + 1))
                            seen.add(x)
            return -1
    
  • 相关阅读:
    wget(转)
    852. Peak Index in a Mountain Array
    617. Merge Two Binary Trees
    814. Binary Tree Pruning
    657. Judge Route Circle
    861. Score After Flipping Matrix
    832. Flipping an Image
    461. Hamming Distance
    654. Maximum Binary Tree
    804. Unique Morse Code Words
  • 原文地址:https://www.cnblogs.com/libbin/p/openLock.html
Copyright © 2011-2022 走看看