Разработайте алгоритм решения исходной задачи при условии, что в системе команд Робота отсутствуют следующие команды:
сверху стена
снизу стена
слева стена
справа стена
Робот всё ещё умеет проверять, свободно ли сверху, снизу, слева или справа. Для любой стороны «стена» означает то же самое, что «не свободно». Поэтому проверку «сверху стена и снизу стена» заменяем условием «не (сверху свободно или снизу свободно)»: выражение в скобках истинно, если открыт хотя бы один проход, а отрицание истинно только тогда, когда закрыты оба прохода. Это логическое преобразование не меняет того, в каких клетках выполняются команды цикла.
Остальные команды исходного алгоритма сохраняем. Получаем алгоритм для горизонтального коридора с открытыми концами:
использовать Робот
алг
нач
влево
нц пока не (сверху свободно или снизу свободно)
закрасить
влево
кц
вправо
нц пока клетка закрашена
вправо
кц
вправо
нц пока не (сверху свободно или снизу свободно)
закрасить
вправо
кц
влево
нц пока клетка закрашена
влево
кц
закрасить
кон
В первом цикле отрицание остаётся истинным в каждой клетке левой части коридора, потому что сверху и снизу проход закрыт. За левым концом оно становится ложным, и Робот останавливает движение влево. По закрашенным клеткам Робот возвращается к исходной незакрашенной клетке. Точно так же он обрабатывает правую часть. Последнее движение по закрашенным клеткам вновь приводит его в исходную клетку, которую он закрашивает отдельной командой.
Таким образом, ни одна из четырёх запрещённых проверок в алгоритме не используется, а результат остаётся прежним: весь коридор закрашен, Робот вернулся на старт.
Условие цикла: «не (сверху свободно или снизу свободно)». Алгоритм закрашивает горизонтальный коридор и возвращает Робота в исходную клетку.
