Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как написать программу для робота, выполняя которую он обойдет все клетки независимо от лабиринта и от своего начального положения?

Лабиринтом называется клетчатый квадрат 10*10, некоторые пары соседних узлов в котором соединены отрезком - "стеной" таким образом, что переходя из клетки в соседнюю по стороне клетку и не проходя через стены, можно посетить все клетки квадрата. Границу квадрата будем также считать обнесенной стеной. В некоторой клетке некоторого лабиринта стоит робот. Он понимает 4 команды - Л, П, В, Н, по которым соответственно идет влево, вправо, вверх и вниз, а если перед ним "стена", то стоит на месте.

ОбразованиеМатематика+3
Анонимный вопрос
Математика и математики
  · 2,0 K

Считаем, что программы - строки символов из алфавита Л, П, В, Н.

Клетки будем обозначать числами от 1 до 100.

Конкатенацию программ p и q будем обозначать p + q; клетку, в которую попадет робот, находившийся в клетке s, после выполнения программы p будем обозначать ps (очевидно, (p + q)s = q(ps)).

Если для каждого лабиринта существует программа, выполнив которую робот обойдет все клетки лабиринта, независимо от того, в какой клетке он находился в начале, контактенация всех таких программ (для всех лабиринтов) будет, очевидно, искомой программой.

Зафиксируем лабиринт, и построим такую программу.

Т.к. лабиринт связен (этого требования нет в постановке, но, очевидно, без него задача не имеет решения), для каждой клетки s существует программа t(s), под действием которой робот, находящийся в клетке s, обойдет все клетки лабиринта.

Обозначим p(1) = t(1).

Если уже построена программа p(s), выполняя которую, робот, находишийся в одной из клеток 1, 2, ..., s, обходит все клетки лабиринта, построим

p(s+1) = p(s) + t(p(s)(s + 1))

Робот, находившийся в состояниях 1, 2, ..., s под ее действием обойдет все клетки лабиринта (т.к. эта программа в начале выполняет p(s)).

Если же робот находится изначально в клетке s + 1, то он в начале под действием p(s) перейдет в состояние p(s)(s+1), а затем под действием t(p(s)(s+1)) обойдет все клетки лабиринта.

Т.о. под действием p(s+1) робот, находившийся в состоянии 1, 2,..., s + 1 обойдет все клетки лабиринта.

Так мы посторим p(s) для любого s = 1, 2, ..., 100. Очевидно, p(100) - искомая программа.

Вспомнился анекдот про Холмса и Ватсона на воздушном шаре... Но плюс поставлю.
Родился, учился и работал в СССР. Инженер-оптик, программист RDBMS, алгоритмист...  · 11 авг 2021
Рекурсия. Список для посещенных клеток. Можно массив, так как размер карты конечен. Массив будет быстрее но памяти потребует больше. ------программа на суперязыке инт старт_майн (){ функция(координата(1,1); //печатать список.колвоэлементов() } функция(координата точка) { От точки "точка" для каждой соседней как "клетка" дуй: если (массив["клетка"]= посещено) дуй... Читать далее
а что за "суперязык" такой? )
программист  · 12 авг 2021
Во-первых условие неточное. Мы должны: - или иметь лабиринт "перед глазами" (в памяти компьютера) - или каждая из 4х команд должна говорить нам успешна она или нет. Во-вторых решение такое: а) отмечаем каждую посещённую клетку б) В каждой клетке: запускаем рекурсивный обход каждой из соседних клеток, если она не была посещена. ПС Подскажите сколько вам лет (и задание... Читать далее
1 эксперт не согласен
"запускаем рекурсивный обход каждой из соседних клеток" не формализовано, поэтому нельзя доказать или опровергнуть... Читать дальше