Задача понятна. Нужно закрасить исходную клетку только в том случае, если клетки над ней и под ней закрашены. Мы будем проверять клетки над и под начальной, не уходя далеко от неё, и закрашивать текущую только если обе проверки положительные.
Как это сделать logically (пошагово и понятно):
- Пусть S — исходная клетка.
- Проверяем, есть ли сверху клетка:
- Если стенки сверху нет (есть клетка выше), переходим вверх на одну клетку, смотрим, закрашена ли эта клетка.
- Возвращаемся на исходную клетку.
- Сохраняем результат проверки: above_filled = да/нет.
- Аналогично проверяем снизу:
- Если есть клетка снизу, переходим вниз, проверяем её состояние, возвращаемся обратно.
- Сохраняем результат: below_filled = да/нет.
- Если обе проверки положительные (above_filled и below_filled равны да), закрашиваем текущую клетку S командой fill_cell().
- Если хотя бы одна из клеток отсутствует (край прямоугольника) или не закрашена, не закрашиваем S.
Пояснение по командам:
- wall_from_up(), wall_from_down() позволяют узнать, есть ли стена над/под. Если wall_from_up() возвращает ложь, значит есть клетка сверху; если истина — верхняя граница или стена.
- move_up()/move_down() перемещают робота на одну клетку вверх/вниз.
- cell_is_filled() возвращает, закрашена ли текущая клетка (после перемещения на неё).
- fill_cell() закрашивает текущую клетку.
- Все проверки выполняются, не нарушая исходного положения, благодаря возвращению назад после проверки.
Псевдокод решения (интуитивно понятный, пригоден для переноса в ваш код/скрипт):
- above_filled = false
- if not wall_from_up():
- move_up()
- if cell_is_filled(): above_filled = true
- move_down()
- below_filled = false
- if not wall_from_down():
- move_down()
- if cell_is_filled(): below_filled = true
- move_up()
- if above_filled and below_filled:
- fill_cell()
Пример последовательности действий, если нужно записать как набор команд:
- Проверка верхней клетки:
- если not wall_from_up():
- move_up()
- если cell_is_filled(): above_filled = true
- move_down()
- если not wall_from_up():
- Проверка нижней клетки:
- если not wall_from_down():
- move_down()
- если cell_is_filled(): below_filled = true
- move_up()
- если not wall_from_down():
- if above_filled и below_filled:
- fill_cell()
Дополнительные замечания:
- Если робот находится на краю прямоугольника (нет верхней или нижней клетки), соответствующая проверка не сможет быть выполнена (то есть above_filled или below_filled останутся false). В этом случае условие «обе клетки над и под закрашены» не выполняется, и исходная клетка не закрашивается.
- Этот подход работает независимо от размера прямоугольника и не требует знания общей карты.
Если хотите, могу привести это в виде конкретного псевдокода на вашем языке/среде или адаптировать стиль под стиль контрольного задания.