Задача понятна: робот находится в любой из четырех клеток квадрата 2×2. Нужно определить, есть ли в этом квадрате закрашенная клетка. Если есть хоть одна закрашенная — перейти в левый верхний угол квадрата; если закрашенных нет — перейти в правый нижний угол. Все действия должны выполняться с использованием предложенных функций.
План решения
- Сначала доберёмся до левого верхнего угла квадрата (это даст нам известную стартовую точку для сканирования).
- Двигаемся влево до стены слева.
- Затем двигаемся вверх до стены сверху.
- Затем последовательно обследуем все четыре клетки квадрата, начиная с верхнего левого:
- Проверяем текущую клетку на заполненность (cell_is_filled()).
- Переходим к соседним клеткам по порядку: верхний правый, нижний правый, нижний левый, с проверками на наличие стены перед каждым перемещением.
- В зависимости от того, найдена ли закрашенная клетка:
- Если нашли: вернуться в левый верхний угол (снова через стены слева и сверху).
- Если не нашли: перейти в правый нижний угол (через стены справа и снизу).
Почему работает этот подход
- В 2×2 квадрате между клетками нет внутренних стен, поэтому перемещаться между соседними клетками можно, пока вокруг есть границы квадрата.
- Проверка wall_from_left/right/up/down позволяет безопасно определить, достигли ли мы края квадрата и не пытаться двигаться за его пределы.
- Обход всех четырех клеток обеспечивает корректную детекцию наличия любой закрашенной клетки независимо от начальной позиции робота.
Программа (используя только предложенные функции)
def go_to_top_left(): # Двигаемся к левому верхнему углу квадрата while not wall_from_left(): move_left() while not wall_from_up(): move_up()
def go_to_bottom_right(): # Двигаемся к правому нижнему углу квадрата while not wall_from_right(): move_right() while not wall_from_down(): move_down()
def main(): # 1) Приезжаем в левый верхний угол, чтобы начать сканирование go_to_top_left()
found = False
# 2) Обход и сканирование всех 4 клеток квадрата
# Проверяем текущую клетку (верхняя левая)
if cell_is_filled():
found = True
# Перемещение к верхнему правому и проверка
if not wall_from_right():
move_right()
if cell_is_filled():
found = True
# Перемещение к нижнему правому и проверка
if not wall_from_down():
move_down()
if cell_is_filled():
found = True
# Перемещение к нижнему левому и проверка
if not wall_from_left():
move_left()
if cell_is_filled():
found = True
# 3) Финальный выбор позиции в зависимости от найденного
if found:
# Вернуться в левый верхний угол
go_to_top_left()
else:
# Перейти в правый нижний угол
go_to_bottom_right()
Запуск программы
main()
Пояснение к коду
- go_to_top_left() перемещает робота к самой левой и самой верхней клетке квадрата за счёт проверки стен.
- go_to_bottom_right() аналогично перемещает к правому нижнему углу.
- В процессе main() мы посещаем все четыре клетки и фиксируем, есть ли закрашенная клетка.
- В конце роботу устанавливаем нужную целевую точку: либо левый верхний угол, либо правый нижний угол.