【力扣752. 打开转盘锁】双向BFS(python3)

该博客介绍了一种解决LeetCode中'打开锁'问题的方法,通过双向广度优先搜索(BFS)策略来寻找从初始状态到目标状态的最短路径。算法包括创建死锁集合,定义获取下一个可能状态的函数,以及更新队列和访问集合的逻辑。在搜索过程中,如果找到目标状态则返回步数,否则继续搜索直至达到预设条件。
摘要由CSDN通过智能技术生成

题目描述

https://leetcode-cn.com/problems/open-the-lock/

思路题解

双向bfs
https://leetcode-cn.com/problems/open-the-lock/solution/gong-shui-san-xie-yi-ti-shuang-jie-shuan-wyr9/

class Solution:
    def openLock(self, deadends: List[str], target: str) -> int:
        dead=set(deadends)
        def getNext(s):
            for i in range(4):
                num = int(s[i])
                for j in [1, -1]:
                    k=s[:i] + str((num + j) % 10) + s[i + 1:]
                    if k not in dead:yield k
        def updateQueue(q,visit,opvisit):
            cur=q.popleft()
            dis=visit[cur]
            for num in getNext(cur):
                if num not in visit:
                    if num in opvisit:
                        return dis+opvisit[num]+1
                    else:
                        q.append(num)
                        visit[num]=dis+1
        from collections import deque
        if target=="0000":return 0
        if "0000" in dead:return -1
        q,qe=deque(["0000"]),deque([target])
        v,ve={"0000":0},{target:0}
        while q and qe:
            if len(q)<=len(qe):
                ans=updateQueue(q,v,ve)
            else:
                ans=updateQueue(qe,ve,v)
            if ans:return ans
        return -1

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值