Программа курса:
Разбор задачи: Бегство от призраков
Предложенный нами код:
def escapeGhosts(ghosts, target):
d = abs(target[0]) + abs(target[1])
for ghost in ghosts:
if abs(ghost[0] - target[0]) + abs(ghost[1] - target[1]) <= d: return False
return TrueДавайте разберем код решения задачи, чтобы понять, как он работает.
def escapeGhosts(ghosts, target):
d = abs(target[0]) + abs(target[1])
for ghost in ghosts:
if abs(ghost[0] - target[0]) + abs(ghost[1] - target[1]) <= d:
return False
return True
1. Определение дистанции до цели
В самом начале вычисляется Манхэттенское расстояние между начальной точкой игрока [0, 0] и целевой точкой target:
d = abs(target[0]) + abs(target[1])
Разбор:
- Формула
abs(target[0]) + abs(target[1])дает сумму модулей координат целевой точки, представляя минимальное количество шагов, необходимых для достижения этой точки. - Пример: Если
target = [3, 4], то расстояниеd = abs(3) + abs(4) = 7.
2. Цикл проверки каждого призрака
Затем для каждого призрака в списке ghosts вычисляется расстояние от его позиции до целевой точки, используя ту же формулу Манхэттенского расстояния:
for ghost in ghosts:
if abs(ghost[0] - target[0]) + abs(ghost[1] - target[1]) <= d:
return False
Разбор:
abs(ghost[0] - target[0])— это расстояние по оси X между призраком и целевой точкой.abs(ghost[1] - target[1])— это расстояние по оси Y между призраком и целевой точкой.- Сумма этих расстояний дает общее количество шагов, которое требуется призраку, чтобы достичь целевой точки.
- Если для какого-либо призрака это расстояние меньше либо равно расстоянию игрока до цели (
d), то возвращаетсяFalse, так как призрак сможет либо опередить, либо догнать игрока.
Пример:
- Пусть
target = [2, 3]иghost = [1, 1]. - Расстояние для призрака:
abs(1 - 2) + abs(1 - 3) = 1 + 2 = 3. - Расстояние для игрока:
abs(2) + abs(3) = 5. - Поскольку призрак добирается быстрее (3 < 5), игрок не сможет спастись.
3. Возврат результата
Если ни один из призраков не может достичь цели быстрее игрока, функция возвращает True:
return True
Разбор:
- Этот результат означает, что игрок имеет преимущество и может достичь цели раньше, чем любой из призраков.
Итоговый анализ
- Сильные стороны решения:
- Простота кода.
- Лаконичность и читаемость: каждая строка выполняет конкретную задачу.
- Использование Манхэттенского расстояния, подходящего для задач на сетке, где можно двигаться только по вертикали и горизонтали.
Пошаговый пример: Входные данные:
ghosts = [[1, 0], [0, 3]] target = [0, 1]Шаги выполнения:
- Расчет расстояния игрока до цели:
d = abs(0) + abs(1) = 1. - Для каждого призрака:
- Призрак
[1, 0]: Расстояние до цели:abs(1 - 0) + abs(0 - 1) = 1 + 1 = 2. - Призрак
[0, 3]: Расстояние до цели:abs(0 - 0) + abs(3 - 1) = 0 + 2 = 2.
- Призрак
- Ни один призрак не достигает цели раньше игрока (
2 > 1), поэтому возвращаетсяTrue.
- Расчет расстояния игрока до цели:
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии