JZX轻语:简

LeetCode 752 - 打开转盘锁

发表于2024年04月29日

#BFS #队列

BFS的应用,使用BFS模拟可能的所有转法(从第1位开始,往上拨or往下拨,直至第4位)。如果某个转法已经处理过or锁死,则不加入队列中。

from collections import deque


class Solution:
    def _roll(self, cur_lock: str):
        for i in range(4):
            yield cur_lock[:i] + (chr(ord(cur_lock[i]) + 1) if cur_lock[i] != '9' else '0') + cur_lock[(i + 1):]
            yield cur_lock[:i] + (chr(ord(cur_lock[i]) - 1) if cur_lock[i] != '0' else '9') + cur_lock[(i + 1):]

    def openLock(self, deadends: List[str], target: str) -> int:
        q = deque()
        visited = set()
        deadends = set(deadends)
        if '0000' in deadends:
            return -1
        q.append((0, '0000'))
        while q:
            step, cur = q.popleft()
            if cur == target:
                return step
            for next_ in self._roll(cur):
                if next_ in visited or next_ in deadends:
                    continue
                visited.add(next_)
                q.append((step + 1, next_))
        return -1

闪念标签:LC

题目链接:https://leetcode.cn/problems/open-the-lock/