752. 打开转盘锁 - 力扣(LeetCode) (leetcode-cn.com)
1.BFS
按找最短路径的方法,先BFS穷举,然后每一层进行判断。
代码如下:
运行结果超时
class Solution(object):
def openLock(self, deadends, target):
"""
:type deadends: List[str]
:type target: str
:rtype: int
"""
def up(curnum,inx):
tar=curnum[inx]
if tar=='9':
tar='0'
else:
tar=str(int(tar)+1)
if inx==0:
return str(tar+curnum[inx+1:])
elif inx==len(curnum)-1:
return str(curnum[:inx]+tar)
else:
return str(curnum[:inx]+tar+curnum[inx+1:])
def down(curnum,inx):
tar=curnum[inx]
if tar=='0':
tar='9'
else:
tar=str(int(tar)-1)
if inx==0:
return str(tar+curnum[inx+1:])
elif inx==len(curnum)-1:
return str(curnum[:inx]+tar)
else:
return str(curnum[:inx]+tar+curnum[inx+1:])
if target=='0000':
return 0
if '0000' in deadends:
return -1
queue=[]
visited=[]
queue.append('0000')
depth=0
while queue:
tmp=[]
while queue:
cur=queue.pop()
if cur in deadends:
continue
if cur==target:
return depth
visited.append(cur)
for i in range(4):
upper=up(cur,i)
if upper not in visited:
tmp.append(upper)
downer=down(cur,i)
if downer not in visited:
tmp.append(downer)
queue=tmp
depth+=1
return -1
2.双向BFS
q1,q2双向搜索,每次用较短的q2来搜索,减少搜索范围
class Solution(object):
def openLock(self, deadends, target):
"""
:type deadends: List[str]
:type target: str
:rtype: int
"""
def up(curnum,inx):
tar=curnum[inx]
if tar=='9':
tar='0'
else:
tar=str(int(tar)+1)
if inx==0:
return str(tar+curnum[inx+1:])
elif inx==len(curnum)-1:
return str(curnum[:inx]+tar)
else:
return str(curnum[:inx]+tar+curnum[inx+1:])
def down(curnum,inx):
tar=curnum[inx]
if tar=='0':
tar='9'
else:
tar=str(int(tar)-1)
if inx==0:
return str(tar+curnum[inx+1:])
elif inx==len(curnum)-1:
return str(curnum[:inx]+tar)
else:
return str(curnum[:inx]+tar+curnum[inx+1:])
if target=='0000':
return 0
if '0000' in deadends:
return -1
q1,q2=[],[]
visited=[]
q1.append('0000')
q2.append(target)
depth=0
while q1 and q2:
tmp=[]
while q1:
cur=q1.pop()
if cur in deadends:
continue
if cur in q2:
return depth
visited.append(cur)
for i in range(4):
upper=up(cur,i)
if upper not in visited:
tmp.append(upper)
downer=down(cur,i)
if downer not in visited:
tmp.append(downer)
q1=q2
q2=tmp
depth+=1
return -1