TGViewer
Python | LeetCode Python | LeetCode @easy_python_task · 9.04K subscribers
Post #2387 724
Задача: 752. Open the Lock
Сложность: medium

Перед вами замок с 4 круглыми колесами. Каждое колесо имеет 10 слотов: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'. Колеса могут свободно вращаться и оборачиваться: например, мы можем повернуть "9" так, чтобы получился "0", или "0" так, чтобы получился "9". Каждый ход состоит из поворота одного колеса на один слот. Изначально замок начинается с '0000', строки, представляющей состояние 4 колес. Вам дан список тупиков, то есть если замок отобразит любой из этих кодов, колеса замка перестанут вращаться, и вы не сможете его открыть. Учитывая цель, представляющую значение колес, которое позволит отпереть замок, верните минимальное общее количество оборотов, необходимое для открытия замка, или -1, если это невозможно.

Пример:
Input: deadends = ["0201","0101","0102","1212","2002"], target = "0202"
Output: 6


👨‍💻 Алгоритм:

1⃣Используйте алгоритм BFS для поиска кратчайшего пути от начального состояния '0000' до целевого состояния, избегая тупиков. Инициализируйте очередь с начальным состоянием '0000' и начальным шагом 0. Используйте множество для отслеживания посещенных состояний, чтобы избежать повторного посещения одного и того же состояния.

2⃣Для каждого состояния в очереди: Проверьте все возможные переходы на следующий шаг, вращая каждое колесо на +1 и -1. Если найденное состояние является целевым, верните количество шагов. Если найденное состояние не является тупиком и не было посещено ранее, добавьте его в очередь и отметьте как посещенное.

3⃣Если очередь пуста и целевое состояние не найдено, верните -1.

😎 Решение:
from collections import deque

def openLock(deadends, target):
def neighbors(node):
for i in range(4):
x = int(node[i])
for d in (-1, 1):
y = (x + d) % 10
yield node[:i] + str(y) + node[i+1:]

dead = set(deadends)
queue = deque([('0000', 0)])
visited = {'0000'}

while queue:
node, steps = queue.popleft()
if node == target:
return steps
if node in dead:
continue
for neighbor in neighbors(node):
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, steps + 1))

return -1


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_python_task
  1. Oct 9, 2026Post #2433
  2. Oct 7, 2026🔥 Скрытые вакансии с удаленной работой для Python разработчика, которые нигде больше не п…
  3. Oct 4, 2026Задача: 958. Check Completeness of a Binary Tree Сложность: medium Дан корень бинарного де…
  4. Oct 4, 2026Задача: 949. Largest Time for Given Digits Сложность: medium Учитывая массив arr из 4 цифр…
  5. Oct 3, 2026Задача: 1312. Minimum Insertion Steps to Make a String Palindrome Сложность: hard Дана стр…
  6. Oct 2, 2026Задача: 1103. Distribute Candies to People Сложность: easy Мы распределяем некоторое колич…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →