Разбор задачи: Симуляция шагающего робота

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

 def robotSim(commands, obstacles):
        i = j = mx = 0
        d, move, obstacles = 3, [(-1, 0), (0, -1), (1, 0), (0, 1)], set(map(tuple, obstacles))
        for command in commands:
            if command == -2: d = (d + 1) % 4
            elif command == -1: d = (d - 1) % 4
            else:
                x, y = move[d]
                while command and (i + x, j + y) not in obstacles:
                    i += x
                    j += y
                    command -= 1
            mx = max(mx, i ** 2 + j ** 2)
        return mx

1. Инициализация переменных

i = j = mx = 0
  • i и j — текущие координаты робота на плоскости. Изначально робот находится в точке (0, 0).
  • mx — переменная для хранения максимального квадрат расстояния от начальной точки (0, 0) до текущей позиции робота. Изначально оно равно 0.

2. Настройка направления движения и преобразование препятствий

d, move, obstacles = 3, [(-1, 0), (0, -1), (1, 0), (0, 1)], set(map(tuple, obstacles))
  • d — текущий индекс направления. Начальное значение 3 соответствует движению "вверх" (север), согласно массиву move.
  • move — список возможных направлений движения:
    • (-1, 0) — движение на юг (уменьшение координаты i).
    • (0, -1) — движение на запад (уменьшение координаты j).
    • (1, 0) — движение на север (увеличение координаты i).
    • (0, 1) — движение на восток (увеличение координаты j).
  • obstacles — множество, содержащее координаты всех препятствий. Преобразование в множество обеспечивает быструю проверку наличия препятствия на пути.

3. Обработка команд

for command in commands:

Цикл перебирает все команды из массива commands. Внутри цикла команда может быть одного из трёх типов: поворот налево, поворот направо или движение вперёд.


3.1. Поворот налево на 90 градусов

if command == -2: 
    d = (d + 1) % 4
  • Если команда равна -2, робот поворачивает налево.
  • Для этого индекс текущего направления d увеличивается на 1, а затем берётся остаток от деления на 4, чтобы индекс оставался в пределах 0–3.

3.2. Поворот направо на 90 градусов

elif command == -1: 
    d = (d - 1) % 4
  • Если команда равна -1, робот поворачивает направо.
  • Индекс направления d уменьшается на 1, а затем берётся остаток от деления на 4. Это позволяет корректно перейти, например, с индекса 0 на 3 (при движении вправо).

3.3. Движение вперёд на заданное количество шагов

else:
    x, y = move[d]
    while command and (i + x, j + y) not in obstacles:
        i += x
        j += y
        command -= 1
  • Если команда — это положительное число, робот должен двигаться вперёд на указанное количество шагов.
  • (x, y) — направление текущего движения, которое берётся из массива move по индексу d.
  • В цикле while проверяется два условия:
    1. У робота остались шаги (command > 0).
    2. Следующая клетка на пути робота не является препятствием ((i + x, j + y) not in obstacles).
  • Если оба условия выполнены:
    • Робот обновляет свои координаты: i увеличивается или уменьшается на x, а j — на y.
    • Количество оставшихся шагов уменьшается на 1.

4. Обновление максимального расстояния

mx = max(mx, i ** 2 + j ** 2)

После выполнения текущей команды вычисляется квадрат расстояния от начальной точки (0, 0) до текущей позиции робота (i, j): distance=i2+j2\text{distance} = i^2 + j^2 Если это значение больше, чем текущее значение mx, то переменная mx обновляется.


5. Возврат результата

return mx

После выполнения всех команд функция возвращает максимальное квадрат расстояния, которое робот достиг за весь путь.


Пошаговый разбор на примере

Рассмотрим пример:
Входные данные:
commands = [4, -1, 4, -2, 4]
obstacles = [[2, 4]]

  1. Инициализация:
    i = 0, j = 0, mx = 0, d = 3 (север)
    obstacles = {(2, 4)}
  2. Команда 4:
    Робот движется на север 4 шага до (0, 4).
    Обновление mx = max(0, 0^2 + 4^2) = 16.
  3. Команда -1:
    Робот поворачивает направо. Новое направление: восток (d = 2).
  4. Команда 4:
    Робот движется на восток, но сталкивается с препятствием на (2, 4). Останавливается на (1, 4).
    Обновление mx = max(16, 1^2 + 4^2) = 16.
  5. Команда -2:
    Робот поворачивает налево. Новое направление: север (d = 3).
  6. Команда 4:
    Робот движется на север 4 шага до (1, 8).
    Обновление mx = max(16, 1^2 + 8^2) = 65.
  7. Возврат результата:
    mx = 65.

Вывод: Робот достиг максимального квадрат расстояния 65.

 



Комментарии

xsnm_avatar
xsnm
,
4 месяца, 19 дней назад

Симуляция шагающего робота

разбор есть нет задание 

и так далее по урокам

 примеры решений не к задачам или наоборот

0

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