Разбор задачи: Бегство от призраков

Предложенный нами код:

 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

Разбор:

  • Этот результат означает, что игрок имеет преимущество и может достичь цели раньше, чем любой из призраков.

Итоговый анализ

  1. Сильные стороны решения:
    • Простота кода.
    • Лаконичность и читаемость: каждая строка выполняет конкретную задачу.
    • Использование Манхэттенского расстояния, подходящего для задач на сетке, где можно двигаться только по вертикали и горизонтали.
  2. Пошаговый пример: Входные данные:

    ghosts = [[1, 0], [0, 3]]
    target = [0, 1]
    

    Шаги выполнения:

    • Расчет расстояния игрока до цели: d = abs(0) + abs(1) = 1.
    • Для каждого призрака:
      1. Призрак [1, 0]: Расстояние до цели: abs(1 - 0) + abs(0 - 1) = 1 + 1 = 2.
      2. Призрак [0, 3]: Расстояние до цели: abs(0 - 0) + abs(3 - 1) = 0 + 2 = 2.
    • Ни один призрак не достигает цели раньше игрока (2 > 1), поэтому возвращается True.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии