Нужен алгоритм прохождения лабиринта #720238


#0 by poi
Нужен алгоритм прохождения лабиринта. Классический алгоритм дает решение для одного проходящего. В итоге имеем карту лабиринта. А мне нужен такой, когда проходящих несколько (как-бы распараллеливание процесса составление карты лабиринта).
#1 by 1cVandal
один идет левой рукой стену касается, другой правой(в разные стороны по одной стене) можно по разным стенам
#2 by Fram
не знаю как работает классический, в школе решал через рекурсию
#3 by 18plus
+ на каждом ветвлении можно добавлять нового проходящего с другой рукой.
#4 by RomanYS
это программная задача или жизненная   в любом случае интересны детали
#5 by 18plus
жизненная конечно, потерялся чувак :)
#6 by anatoly
...проходящих несколько... а сколько входов/выходов?
#7 by aka AMIGO
классическая схема прохождения лабиринта - скользить одной рукой по стене, не прерывая контакт
#8 by Кай066
нельзя, круги может начать внутри лабиринта нарезать
#9 by Kamas
есть еще алгоритм Заполнения или поиска в ширину
#10 by Asmody
Если "ходок" может себя "клонировать", то на каждом перекрестке клонируем по количеству доступных путей - 1, отмечаем перекресток как посещенный и каждый идет своим путем до следующего перекрестка. Там операцию повторяем. Кто-то найдет выход, остальные либо упрутся в тупик, либо будут ходить по кругу.
#11 by Asmody
Точнее не так: если один из клонов попал в тупик или на посещенный перекресток, то он аннигилируется.
#12 by Крошка Ру
Как отличить ходящего по кругу от не ходящего, но пока не дошедшего до выхода?
#13 by 13_Mult
#14 by Asmody
из следует, что в "живых" останется только нашедший выход
#15 by 13_Mult
#16 by poi
это все для одного проходящего. процесс последовательный. когда проходящих несколько, то надо как-то координировать их усилия по прохождению, чтобы по нескольку раз не ходили уже хожденные тупики/кольца. Асмоди хорошо придумал с клонированием, но задача для ограниченного количества проходящих. Хотя, если развить мысль, то момент уничтожения очередного клона можно отождествлять с рождением нового в новой точке. Осталось только оптимизировать путь, который проходит нечто с момента смерти по момент рождения.
#17 by Asmody
тогда раздать всем маркеры - красный и цветной каждому свой. Коридор по еоторому вошли отмечаем красным, коридор куда уходим отмечаем своим цветом. Если попали в тупик, то возвращаемся назад на шаг. Если есть незакрашенные коридоры, идем туда, если нет - садимся и плачем.
#18 by ws_mason
А мне бы наоборот. Алгоритм создания лабиринта, с тонкими стенками, не по клеточкам.
#19 by 18plus
деление идущих на развилках + отмечать уже топтанные дорожки, если текущий идущий наткнулся на хоженную дорожку - его дезинтегрируем и двигаем остальных.
#20 by Asmody
Не, не плачем, идем еще на шаг назад. Кто-то выйдет из лабиринта, остальные врнутся ко входу.
#21 by Asmody
Это же задача поиска путей в графе :-)
#22 by Ёпрст
волновой алгоритм поиска пути подойдёт ?
#23 by poi
ну так "лабиринт" сказано - чтоб не распугать публику.
#24 by poi
сейчас посмотрю
#25 by Ёпрст
в школе заставляли его писать
#26 by Ёпрст
был еще какой-то алгоритм, тоже простецкий, не помню.
#27 by Asmody
а как его распараллелить?
#28 by Ёпрст
ну, запускать несколько волн с разных точек, только зачем ? Когда он один сам всё найдёт (выход, т.е)
#29 by Ёпрст
ну, а если дырку (выход) заткнуть - "заполнит" весь лабиринт
#30 by Зойч
Ищи многопоточный обход дерева
#31 by Зойч
Кстати правило правой руки не всегда решает лабиринт
#32 by Зойч
#33 by DrZombi
А если Лабиринт зациклен? :)
#34 by Эмбеддер
на самом деле если зайти в лабиринт и идти вдоль любой стены, постоянно поворачивая в ее сторону, мы никогда не зациклимся. исходное расположение -у в входа, сама площадь лабиринта - прямоугольная. кто не согласен - нарисуйте свой вариант в качестве примера
#35 by Эмбеддер
+ т.е. я имею в виду, что вариант полностью правильный и зациклиться не получится)))
#36 by Лодырь
А волновой алгоритм не проще сюда присобачить?
#37 by aka AMIGO
вообще-то - да.. неее.. я переумничал.. :) представь себе столб, любой толщины, скользим по одной стене, совершаем бесконечный цикл.. а если весь лабиринт состоит из таких "столбов", то проблема может статься длиною в жизнь :) Вот пример трех таких (стобовых :) ) образований, как решить проблему - выше моего сознания :)
#38 by aka AMIGO
стобовых = "столбовых"
#39 by aka AMIGO
+37 ну, разве что оставить заметный след, чтоб не повторять путь
#40 by Mefistophel
если идти срого по стене то на такие "столбовые" "островки" ты никогда не попадешь. Если речь про клонов на ответвлениях то там же идея с маркировкой есть, которая решает эту проблему.
#41 by Эмбеддер
если скользить например вдоль правой стены, то мы до столба никогда не дотронемся. ну, только если страртовали возле столба, так мы и выйдем сразу же из лабиринта)))
#42 by aka AMIGO
это зависит от того, когда человек, вошедший в лабиринт, опроблемился выходом :) если зашел глубоко - замучится искать стенку :)
#43 by anatoly
проходится и по левой руке и по правой.
#44 by Mefistophel
а, если точка "входа" в лабиринт произвольная - то только маркировка
#45 by Wasya
Алгоритмов обхода лабиринта в общем случае всего два 1) Поиск в ширину; 2) Поиск в глубину. Если иследователи лабиринта могут телепоритроваться в любую точку лабиринта, то поиск в ширину вполне подходит. В противном случае, придется использовать поиск в глубину. Но в этом случае, придется мириться, что на исследователей выпадет различная нагрузка. кто то быстро закончит свою часть исследований, а кто то будет долго блуждать по лабиринту.
#46 by aka AMIGO
куда этому горемыке податься? :)
#47 by Asmody
вот так он пойдет по правой руке с раскраской
#48 by Chai Nic
Ну да, но обычно задача ставится не пройти лабиринт, а выйти из него. То есть, исходная точка может где угодно оказаться, в том числе и возле "цикла" по правую/левую руку.
#49 by Лодырь
Кстати, распараллелить можно простейшим способом на два потока, используя метод встречной волны. А если есть waypoint'ы то и на большее количество потоков.
#50 by an-korot
Еще для разнообразия добавить условие,  на какое расстояние видит поисковик или можно видеть на несколько клеток? )))
#51 by 1Сергей
алгоритм построения лабиринта куда интереснее, имхо
#52 by Domovoi
Что-то не догоняю в чем проблема? Ищем путь через рекурсию с сохранением координат прохода, когда наткнулись на тупик или на место где уже были прекращаем итерацию рекурсии. В итоге или найдем выход или определим что выхода нет. (естественно если лабиринт без телепортов и постоянен во времени) Проход по левую руку, это повыпендриваться перед 5 летним ребенком:) Реально этот метод не работает.
#53 by Domovoi
+(и если одноэтажный лабиринт)
#54 by Ёпрст
такие тоже есть, даже с реализацией..
#55 by Ёпрст
#56 by vmlspb
Алгоритм A*
#57 by Ник второй
Киньте на другой файлообменник, а то инфостарт не удобный.
#58 by Torquader
Решение задачи с алгоритмом прохождения лабиринта нужно начинать с вопроса о хранении лабиринта в памяти компьютера.
#59 by Torquader
Если мы применяем правило правой или левой руки при выходе из лабиринта (когда мы неизвестно как попали в какую-то точку), то в случае наличия в лабиринте циклов правило может не позволит выйти. Если же мы применяем правило на входе в лабиринт, то даже если в нём и есть циклы и несвязные области, то мы всегда останемся в той области, которая выходит на границу - другими словами - всегда выйдем наружу снова, но или через данный вход или через другой.
#60 by Torquader
Если мы можем запоминать координаты лабиринта и "возвращаться" в нужную точку, то можно хоть построчно его анализировать - такая задача ничего общего с прохождением лабиринта не имеет. P.S. конечно, следует понимать, что лабиринт плоский и не имеет ходов на разных уровнях по высоте - задача прохождения трёхмерного лабиринта кардинально отличается о  прохождения двухмерного (хотя, в случае, с возможностью "запоминания" маршрута можно делать что угодно.
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С