752. 打开转盘锁
https://leetcode-cn.com/problems/open-the-lock/
解法一:bfs
起点是字符串"0000",终点是target,求"0000"变为target的最少操作次数,即bfs问题
import queue
class Solution:
def openLock(self, deadends: List[str], target: str) -> int:
q = queue.Queue() #队列
q.put('0000') #初始放入起点
visited = set() #记录访问过的结点
deadendsSet = set(deadends) #deadends转为集合加快查询
step = 0 #旋转次数
visited.add("0000") #标记起点已访问
#辅助函数
#将s[j]位加1
def plusOne(s, j):
chs = list(s)
if chs[j] == '9':
chs[j] = '0'
else:
chs[j] = str(int(chs[j])+1)
return ''.join(chs)
#将s[j]位减1
def minusOne(s, j):
chs = list(s)
if chs[j] == '0':
chs[j] = '9'
else:
chs[j] = str(int(chs[j])-1)
return ''.join(chs)
while not q.empty():
#记录当前队列大小(BFS本轮迭代),以供后续遍历
size = q.qsize()
for i in range(size):
cur = q.get() #从队列取出一个
if cur in deadendsSet:
continue
if cur == target:
return step
for j in range(4):
#cur[j]加一,结果放入队列
p = plusOne(cur, j)
if p not in visited:
q.put(p)
visited.add(p)
#cur[j]减一,结果放入队列
m = minusOne(cur, j)
if m not in visited:
q.put(m)
visited.add(m)
step += 1
return -1
最后更新于