Skip to content

Open Lock

LeetCode Problem

# https://leetcode.com/problems/open-the-lock/description/
# https://www.youtube.com/watch?v=Pzg3bCDY87w


class Solution:
    def openLock(self, deadends: List[str], target: str) -> int:
        if "0000" in deadends:
            return -1

        def children(lock):
            ans = []
            for i in range(4):
                digit = str((int(lock[i]) + 1) % 10)
                ans.append(lock[:i] + digit + lock[i + 1 :])
                digit = str((int(lock[i]) - 1 + 10) % 10)
                ans.append(lock[:i] + digit + lock[i + 1 :])
            return ans

        q = deque()
        q.append(["0000", 0])  # [lock, turns]
        visit = set(deadends)
        while q:
            lock, turns = q.popleft()
            if lock == target:
                return turns  # answer found
            for child in children(lock):
                if child not in visit:
                    visit.add(child)
                    q.append([child, turns + 1])  # backtracking solution
        return -1