По периметру большого прямоугольного зала устроены небольшие ниши, отделённые друг от друга стенами. Роботу надо обойти все эти ниши. Для начала надо научить его двигаться вдоль одной стены. Напишите программу, которая позволит роботу перейти в следующую по часовой стрелке нишу (клетку) и покрасить её.
Ответ нейросети
16 марта 2026 13:59
Задача понятна: обход по периметру прямоугольного зала по часовой стрелке и окраска каждой ниши (клетки) по мере посещения. Мы моделируем ниши как клетки решетки, расположенные по перимету прямоугольника: сверху слева направо, затем по правой стороне вниз, снизу справа налево и по левой стороне вверх до закрытия круга. Далее — простой алгоритм: заранее формируем цикл периметра, по нему переходим к следующей клетке и красим её.
Пошаговое решение
- Определяем последовательность ниш вдоль периметра
- Пусть зал задаётся количеством ниш по вертикали R и по горизонтали C.
- Периметр состоит из 2*(R + C) - 4 ниш.
- Порядок (по часовой стрелке):
- верхняя сторона: (0, 0) … (0, C-1)
- правая сторона (без углов): (1, C-1) … (R-2, C-1)
- нижняя сторона: (R-1, C-1) … (R-1, 0)
- левая сторона (без углов): (R-2, 0) … (1, 0)
- Функция следующей ниши
- Следующая ниша вычисляется как следующий элемент в списке периметра, используя цикл.
- Обход и покраска
- Выбираем стартовую нишу на периметре (обычно (0,0)).
- Прогоняем цикл по всем нишам периметра ровно столько раз, сколько их всего.
- На каждой итерации помечаем текущую нишу как покрашенную и переходим к следующей.
- Пример входа/выхода
- Вход: число ниш по вертикали R и по горизонтали C.
- Выход: последовательность координат ниш в порядке покраски (и состояние окраски каждой из них).
- Сложность
- Время: O(N), где N = 2*(R + C) - 4 — число ниш на периметре.
- Память: O(N) для хранения порядка ниш (можно обойтись и без сохранения полного списка, но хранение упрощает реализацию и работу с роботизированной реальностью).
- Адаптация под реального робота
- Нормально: робот получает команду перейти в клетку (r, c) из очереди и выполнить покраску.
- В реальном устройстве заменяем вывод координат на вызовы движения к данной позиции и затем вызов покраски (paint).
- Можно при желании начинать обход с любой стартовой ниши, вращая порядок списка так, чтобы старт соответствовал нужной камере робота.
Пример кода на Python (для моделирования робота)
Функция формирования списка ниш по периметру в порядке обхода по часовой стрелке
def perimeter_cells(nr, nc): # nr: число ниш по вертикали (высота периметра) # nc: число ниш по горизонтали (ширина периметра) cells = [] if nr <= 0 or nc <= 0: return cells if nr == 1: for c in range(nc): cells.append((0, c)) return cells if nc == 1: for r in range(nr): cells.append((r, 0)) return cells
# верхняя сторона
for c in range(nc):
cells.append((0, c))
# правая сторона без углов
for r in range(1, nr - 1):
cells.append((r, nc - 1))
# нижняя сторона
for c in range(nc - 1, -1, -1):
cells.append((nr - 1, c))
# левая сторона без углов
for r in range(nr - 2, 0, -1):
cells.append((r, 0))
return cells
Построение маршрута и переход к следующей нише
def traverse_and_paint(nr, nc, start=None): path = perimeter_cells(nr, nc) if not path: return []
# выбрать стартовую нишу
if start is None:
start = path[0]
if start not in path:
raise ValueError("Стартовая ниша должна быть на периметре.")
# повернуть маршрут так, чтобы старт была первой клеткой
idx = path.index(start)
ordered = path[idx:] + path[:idx]
# имитируем покраску: просто перечисляем порядок
painted_order = []
for pos in ordered:
painted_order.append(pos)
# здесь можно заменить на вызов движения к pos и paint()
# например: robot.move_to(pos[0], pos[1]); robot.paint()
return painted_order
Пример использования
if name == "main": R = 4 # высота периметра (число ниш по вертикали) C = 6 # ширина периметра (число ниш по горизонтали) order = traverse_and_paint(R, C) # старт по умолчанию: (0,0)
print("Порядок покраски ниш по периметру:")
for i, (r, c) in enumerate(order, 1):
print(f"{i}: ниша ({r}, {c})")
# Если требуется начать с другой ниши, например (0, 3):
# order2 = traverse_and_paint(R, C, start=(0, 3))
# print(order2)
Что можно адаптировать под учебную задачу
- Если размер прямоугольника известен заранее, можно прямо подать в программу R и C и получить полный маршрут.
- Можно реализовать прямой цикл без хранения полного списка: держать текущую позицию и направление движения (вверх, вправо, вниз, влево) и менять направление только на углах периметра, но усложняет логику. Предложенный подход с заранее построенным списком упрощает и ускоряет разработку для обучающей задачи.
- Для реального робота заменить печать и расчёт на реальные вызовы API движения и покраски.
Если хотите, могу привести пример реализации под конкретный язык или под конкретный интерфейс робота (например, ROS, микроконтроллеры и т.д.). Также могу адаптировать код под начальную позицию, размеры зала, или добавить визуализацию результата.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



