题目描述
https://leetcode-cn.com/problems/open-the-lock/
思路题解
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