Задача: Робот в квадрате 3×3 должен остановиться в центральной клетке.
Гипотеза: вокруг квадрата стоят стены по периферии; в центре обе стороны свободны. Мы будем двигаться так, чтобы попасть в верхний левый угол, а оттуда — в центр. Это работает независимо от начальной клетки.
Пояснение логики
- В 3×3 квадрате левые и верхние границы можно распознать по наличию стены слева и стены сверху соответственно.
- Пока есть стена слева, мы в левом столбце; пока есть стена сверху, мы в верхнем ряду.
- Выполнив два цикла до границ, мы попадём в верхний левый угол (координаты (0,0)).
- Из верхнего левого угла центр — это соседняя клетка справа на одну и клетка ниже на одну: два шага вправо и вниз доведут до центра (координаты (1,1)).
- Затем можно выполнить fill_cell, чтобы закрасить центр, если задача требует пометить занятую клетку.
Пошаговый алгоритм
- Дойти до верхнего левого угла:
- пока не wall_from_left: выполнить move_left
- пока не wall_from_up: выполнить move_up
- Перейти к центру:
- выполнить move_right
- выполнить move_down
- (Опционально) выполнить fill_cell, чтобы закрасить центральную клетку.
Почему это корректно
- Любая начальная клетка в 3×3 имеет путь к верхнему левому углу без пересечения стен: сначала прибегаем к левой границе, затем к верхней.
- Из верхнего левого угла центр лежит в одной клетке вправо и одной клетке вниз, поэтому два последних шага приводят именно в центр.
- Это решение работает для всех исходных позиций в квадрате 3×3.
Пример набора команд (без условных ветвлений, как паттерн алгоритма)
- while не wall_from_left: move_left
- while не wall_from_up: move_up
- move_right
- move_down
- (опционально) fill_cell
Если нужно просто остановиться в центре, без окрашивания, пропустите последний шаг fill_cell. Если же требуется закрасить центр, добавьте fill_cell после достижения центра.