Программа курса:
Разбор задачи: Симуляция шагающего робота
Предложенный нами код:
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 mx1. Инициализация переменных
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проверяется два условия:- У робота остались шаги (
command > 0). - Следующая клетка на пути робота не является препятствием (
(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]]
- Инициализация:
i = 0, j = 0, mx = 0, d = 3 (север)obstacles = {(2, 4)} - Команда 4:
Робот движется на север 4 шага до (0, 4).
Обновлениеmx = max(0, 0^2 + 4^2) = 16. - Команда -1:
Робот поворачивает направо. Новое направление: восток (d = 2). - Команда 4:
Робот движется на восток, но сталкивается с препятствием на (2, 4). Останавливается на (1, 4).
Обновлениеmx = max(16, 1^2 + 4^2) = 16. - Команда -2:
Робот поворачивает налево. Новое направление: север (d = 3). - Команда 4:
Робот движется на север 4 шага до (1, 8).
Обновлениеmx = max(16, 1^2 + 8^2) = 65. - Возврат результата:
mx = 65.
Вывод: Робот достиг максимального квадрат расстояния 65.
xsnm
,Симуляция шагающего робота
разбор есть нет задание
и так далее по урокам
примеры решений не к задачам или наоборот