打开转盘锁 -- BFS

打开转盘锁

这里提供两种实现,单向BFS和双向BFS。

python 复制代码
class OpenLock:
    """
    752. 打开转盘锁
    https://leetcode.cn/problems/open-the-lock/
    """
    def solution(self, deadends: List[str], target: str) -> int:
        """
        单向BFS
        :param deadends: 
        :param target: 
        :return: 
        """
        visited = set()
        # 将deadends初始化到visited数组中
        for deadend in deadends:
            visited.add(deadend)

        queue = []
        step = 0
        queue.append('0000')
        visited.add('0000')

        while queue:
            sz = len(queue)
            for i in range(sz):
                cur = queue.pop(0)

                if cur == target:
                    return step

                if cur in visited:
                    continue

                visited.add(cur)

                for j in range(4):
                    up = self.plusOne(cur, j)
                    if up not in visited:
                        queue.append(up)

                    down = self.minusOne(cur, j)
                    if down not in visited:
                        queue.append(down)

            step += 1
        return -1

    def plusOne(self, cur, j):
        if cur[j] == '9':
            return cur[:j] + '0' + cur[j+1:]
        else:
            return cur[:j] + str(int(cur[j])+1) + cur[j+1:]

    def minusOne(self, cur, j):
        if cur[j] == '0':
            return cur[:j] + '9' + cur[j + 1:]
        else:
            return cur[:j] + str(int(cur[j]) - 1) + cur[j + 1:]

    def solution2(self, deadends: List[str], target: str) -> int:
        """
        双向BFS优化
        :param deadends: 
        :param target: 
        :return: 
        """
        deads = set()
        visited = set()
        # 将deadends初始化到visited数组中
        for deadend in deadends:
            deads.add(deadend)

        q1 = set()
        q2 = set()
        q1.add('0000')
        q2.add(target)
        step = 0

        while q1 and q2:
            # 额外优化
            if len(q1) > len(q2):
                tmp = q1
                q1 = q2
                q2 = tmp

            temp = set()
            for cur in q1:
                if cur in deads:
                    continue
                if cur in q2:
                    return step

                visited.add(cur)

                for j in range(4):
                    up = self.plusOne(cur, j)
                    if up not in visited:
                        temp.add(up)

                    down = self.minusOne(cur, j)
                    if down not in visited:
                        temp.add(down)

            step += 1
            # 这里temp相当于q1,交换q1和q2
            q1 = q2
            q2 = temp

        return -1
相关推荐
硕风和炜3 天前
【LeetCode: 958. 二叉树的完全性检验 + bfs + 二叉树】
java·算法·leetcode·二叉树·bfs·宽度优先·完全二叉树
qwq_ovo_pwp6 天前
题解 洛谷 Luogu P1113 杂务 图论 BFS C++
数据结构·c++·算法·图论·宽度优先
余辉zmh6 天前
【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径
数据结构·c++·算法·leetcode·宽度优先
he1010112 天前
1/20赛后总结
算法·深度优先·启发式算法·广度优先·宽度优先
悄悄敲敲敲14 天前
C++:bfs解决多源最短路与拓扑排序问题习题
算法·宽度优先
BingLin-Liu20 天前
备战蓝桥杯:树的存储与遍历(dfs和bfs)
算法·深度优先·宽度优先
打不了嗝 ᥬ᭄22 天前
DFS与BFS
算法·深度优先·图论·宽度优先
闻缺陷则喜何志丹22 天前
【C++图论 BFS】1129. 颜色交替的最短路径|1779
c++·力扣·图论·最短路·宽度优先·颜色·交替
leing1231 个月前
173. 矩阵距离 acwing -多路BFS
算法·矩阵·宽度优先·多路bfs
是阿建吖!1 个月前
【优选算法】队列+宽搜(BFS)
c++·算法·宽度优先