Pull to refresh

Comments 36

Ну вроде один из самых простых алгоритмов — идти вдоль стенки
_____
|В   |
|  П |
|____|

Идите (простите за кривизну лабиринта)
это не лабиринт на «картинке», просто комната.
Ну, видимо, имеется в виду случай, когда приз лежит на у стенки, а посередине комнаты. Если идти вдолль стенки, на приз не наткнемся.
Лабиринт 3х3, без перегородок. Приз в центре, Вы у стенки.
Делать шаги в случайном направлении. Так как время бесконечно — когда-нибудь придем :)
Хороший вариант. Но что делать, если у нас нет датчика случайных чисел, чтобы шагать случайно?
Какие ещё ограничения на алгоритм, огласите уж сразу.
Алгоритм — это последовательность шагов «влево-вправо-вперед-назад».
Можно составить карту, и использовать ее, чтобы пройти все клетки (так как у нас нет информации о местоположении приза). Проверить, есть ли вокруг стенки, отметить их на карте. Допустим, с одной стороны стенка, шагнуть в случайном направлении, а два других пометить, чтобы проверить потом. Так продолжать, пока не упремся в тупик, тогда возвратиться к ближайшей клетке, где остались непроверенные направления и т. д., пока не наткнемся на приз.
Простите, ошибся в формулировке. Забыл условие, запрещающее такое простое решение (нельзя использовать условные операторы). Пожалуйста, сильно не бейте.
Игра «поиски клада»? Для полного сходства осталось добавить телепорты и реки :-)
Обходить в глубину, параллельно рисуя карту. Если квадратики можно различать, то на бумаге в клетку получится.
Проверять лень, но можно было бы попробовать:
while(not_found){
go_left(m*n);
go_up(m*n);
go_right(m*n);
go_down(m*n);
}
Не работает.
_______
|В |
| -|

(полоска 1x2, вы слева, выход под вами)
автору, похоже, дали в качестве ДЗ разработать этот алгоритм, а он подключил Хабравчан. )
Я знаю решение. Если хотите — могу написать в личку.
А рекурсивная программа считается программой конечной длины или нет?
Нет. Программа — это просто последовательность инструкций куда пойти (влево/вправо/вперед/назад).
Да. Зачем циклы, если нет условий?)
Есть подозрение, что для данной задачки рекурсия и циклы –– не более, чем сокращённая форма записи.

Кстати, автор воткнул решение?
Похоже, что решение тут плутание по какому-то однообразному маршруту (круг, замысловатая восьмёрка или спираль, а может их комбинация) большое число раз. Больше идей нет.

Я с вами согласен — это развернутый цикл for
Угу. Не думаю, что надо замысловатое решение. Небось, можно просто устроить полный перебор всевозможных путей из данной точки. Ограничений на время нет.
Можно составить все возможные лабиринты, со всевозможным начальным стартовым положением и положением приза. После этого перебирать их по очереди.
Сначала идем по первому лабиринту до приза. Потом на 2м лабиринте наносим наш предыдущий путь и идем из конечной точки до приза. После этого на третий лабиринт наносим путь из первых двух лабиринтов и идем из новой конечной точки для третьего лабиринта до приза. И так далее.
Так как лабиринт конечен, то количество вариантов конечно.
Вот собственно и правильное решение
Не понятно какой смысл в нанесении положения приза. проще уже полный обход лабиринта — решение тогда по идее получится меньше по объему.
Вариантов — лабиринт+исходное положение около n2*2(n-1)*(n-1) — то есть очень много )
При учете положения приза еще домножаем на n2, но ходов надо меньше.
А как предполагается возвращаться в нужную точку, с которой начинается ваша последовательность ходов для проверяемого лабиринта и точки старта? Ведь если робот не чувствует стен, то просто выполнить последовательность в обратном порядке не достаточно, а телепортация в исходную точку вроде как в условии не обговорена.
Возвращаться не надо. Надо брать новый лабиринт с новым начальным расположением и просчитывать в нем весь предыдущий путь, подразумевая «если бы я был в такой начальной позиции, то сейчас я бы оказался в таком месте». После такого просчета обходить новый лабиринт не из исходного состояния, а из нового, модифицированного предыдущим маршрутом.
Стоп. А как это вы собрались «просчитывать» если
условия он проверять не умеет, то, что уперся в стену — не замечает
м?
Имхо, «накладывать» не получиться, хотя бы потому, что не все маршруты являются накладываемыми.

Ну, вот, для примера, есть поле 5х5:

Где ваш робот и где приз, думаю, ясно. :)
Предположим, что робот сделал все возможные варианты карты и просчитал все возможные расположения себя и приза. Первый ход он делает на E5 (согласно его первому предположению — приз справа, в ближайшей клетке). После этого он хочет попасть в точку С5 (возможно приз был слева начального положения, в ближайшей клетке), поэтому он двигается в D5, и пытается двинуться в C5 (но ясно, что у него это не получается). Следующая предположительная точка — D4 (т. е. выше на одну клетку его начального положения), а т. к. он не заметил стены, он делает два хода — сначала вправо на своё начальное положение (но на самом деле, на E5) и вверх на D4 (на самом деле, на E4). И вот с данного момента робот «потерялся». Дальше он не сможет позиционировать себя, даже имея правильную карту стен.

Возможно, в конце концов, после всех движений он таки возьмёт приз, но эта возможность не равняется 100% потому что даже если бы робот точно знал своё положение на карте, он всё равно бы запутался (как я выше показал). А это может значить, что или я где-то допустил ошибку (к сожалению, частенько бывает), или же ваше решение не правильное.

Сможете написать программу (конечной длины) для этого варианта, без использования условий (а значит и циклов) согласно своим рассуждениям и условиям задачи? Я, например, так точно не представляю как это сделать.
Назовем конфигурацией лабиринта набор «стены, положение робота, положения приза».
Конфигураций лабиринта MxN конечное число.
Пронумеруем их.
Идем так, чтобы добраться до приза, если первая конфигурация истинна.
С учетом уже сделанных шагов идем так, чтобы добраться до приза, если вторая конфигурация истинна (мы знаем, куда пытались идти, поэтому, если истинна вторая конфигурация — мы знаем где мы).
С учетом уже сделанных шагов идем так, чтобы добраться до приза, если третья конфигурация истинна.

Ваше рассуждение правильно, если перебирать только свою и приза позиции. Если же перебирать конфигурации стен — такой ситуации не возникнет (да, робот будет часто упираться в стены), т.к. как только мы дойдем до истинной конфигурации, маршрут окажется правильным.
А. Значит, правильный вариант ответа — перебор всех возможных конфигураций, с «перепрокладыванием» маршрута, учитывая предыдущие попытки двигаться, по каждой [конфигурации] из них, да?
Только «перепрокладыванием», этим самым, занимается не робот, а мы (по этому и нельзя проверять условия — роботу это делать незачем, мы уже всё должны были просчитать) [именно этот момент я упустил]. Ужас, имхо, но под условия задачи подходит. :)

Спасибо за задачку и разъяснение.
Это же простая задачка со всероссийской. Перечисляем все лабиринты и возможные начальные положения нас и приза. Берем одно из них, идем к призу по какому-либо пути. Потом смотрим куда преобразовалось наше множество троек (лабиринт, начальное положение, приз) под действием этой комбинации (если под действием комбинации мы прошли через приз, то эту тройку откидываем). Берем следующий элемент и идем к призу по какому-нибудь пути и.т.д. На каждом шаге мощность множества уменьшается по крайней мере на единицу и потому длина программы будет не больше (количество лабиринтов)*(M*N)^3 (не самопересекающийся путь не может быть длиннее M*N).
Sign up to leave a comment.

Articles