Задача № 2 Робот находится где-то в прямоугольнике. Одна клетка рядом с исходной покрашена. Робот должен оказаться в ней. move_left() Сделать шаг влево move_right() Сделать шаг вправо move_up() Сделать шаг вверх move_down() Сделать шаг вниз fill_cell() Закрасить клетку free_from_up() Проверить, свободно ли сверху free_from_down() Проверить, свободно ли снизу free_from_left() Проверить, свободно ли слева free_from_right() Проверить, свободно ли справа wall_from_up() Проверить, есть ли стена сверху wall_from_down() Проверить, есть ли стена снизу wall_from_left() Проверить, есть ли стена слева wall_from_right() Проверить, есть ли стена справа cell_is_filled() Проверить, закрашена ли клетка cell_is_clean() Проверить, чиста ли клетка
Задача понятна: из четырех соседних клеток ровно одна закрашена. Нужно попасть в нее, используя доступные команды. Предложу простой надёжный способ: проверить каждую соседнюю клетку по очереди. Если она закрашена — перейти в неё и остановиться. Чтобы не упасть в пропуск, будем обходить направления в фиксированном порядке и возвращаться обратно, если клетка не закрашена.
Пошаговое решение (пояснение и действия robot):
Исходные предпосылки
- Ровно одна соседняя клетка рядом с начальной закрашена.
- Возможны стены вокруг, которые нельзя пересечь (помнить про wall_from_...).
- Чтобы узнать, закрашена ли клетка, нужно зайти в неё и проверить cell_is_filled() для текущей клетки.
- Чтобы вернуться обратно к исходной клетке, используем обратные перемещения.
План действий
1) Проверяем верхнюю клетку (up)
- Если есть стена сверху (wall_from_up() возвращает истину), переходим к шагу 2.
- Иначе:
- move_up() — робот перебирается в клетку выше.
- if cell_is_filled() — текущая клетка закрашена: задача выполнена, робот уже на нужной клетке. Остановиться.
- else: move_down() — вернулись в исходную клетку, продолжим поиск.
2) Проверяем правую клетку (right)
- Если есть стена справа (wall_from_right() истина), перейти к шагу 3.
- Иначе:
- move_right()
- if cell_is_filled() — текущая клетка закрашена: задача выполнена, робот на нужной клетке. Остановиться.
- else: move_left() — вернулись в исходную, продолжим.
3) Проверяем нижнюю клетку (down)
- Если есть стена снизу (wall_from_down() истина), перейти к шагу 4.
- Иначе:
- move_down()
- if cell_is_filled() — текущая клетка закрашена: задача выполнена. Остановиться.
- else: move_up() — вернулись, продолжим.
4) Проверяем левую клетку (left)
- Если есть стена слева (wall_from_left() истина), переход к финалу.
- Иначе:
- move_left()
- if cell_is_filled() — текущая клетка закрашена: задача выполнена. Остановиться.
- else: move_right() — вернулись.
Финал
- Если после проверки всех четырёх направлений ни одна соседняя клетка не оказалась закрашенной (это противоречит условию задачи), можно сообщить об ошибке или перепроверить условия. Но в рамках задачи такое не должно произойти.
Почему так работает
- Мы ищем именно ту соседнюю клетку, которая закрашена. Поскольку она ровно одна, как только мы зайдём в неё, проверка cell_is_filled() даст истину и мы остановимся без необходимости дальних обходов.
- Мы учитываем стены, чтобы не пытаться перейти через них.
Схематически можно представить так:
- Попытка вверх: если возможно и закрашена — найдено; если возможно и не закрашена — вернуться; если невозможно — пропустить.
- То же для направлений справа, вниз, слева в указанном порядке.
Дополнительно
- Если хочешь, могу привести вариант в виде псевдокода или короткого алгоритмического блока, который можно перенести в твою языковую среду/среду симуляции.
- Если в условиях встречаются дополнительные ограничения (например, нельзя возвращаться через пройденные клетки или нужно за минимальное число шагов найти закрашенную), скажи — адаптирую план под это.