#0
by poi
Нужен алгоритм прохождения лабиринта. Классический алгоритм дает решение для одного проходящего. В итоге имеем карту лабиринта. А мне нужен такой, когда проходящих несколько (как-бы распараллеливание процесса составление карты лабиринта).
#1
by 1cVandal
один идет левой рукой стену касается, другой правой(в разные стороны по одной стене) можно по разным стенам
#7
by aka AMIGO
классическая схема прохождения лабиринта - скользить одной рукой по стене, не прерывая контакт
#10
by Asmody
Если "ходок" может себя "клонировать", то на каждом перекрестке клонируем по количеству доступных путей - 1, отмечаем перекресток как посещенный и каждый идет своим путем до следующего перекрестка. Там операцию повторяем. Кто-то найдет выход, остальные либо упрутся в тупик, либо будут ходить по кругу.
#11
by Asmody
Точнее не так: если один из клонов попал в тупик или на посещенный перекресток, то он аннигилируется.
#16
by poi
это все для одного проходящего. процесс последовательный. когда проходящих несколько, то надо как-то координировать их усилия по прохождению, чтобы по нескольку раз не ходили уже хожденные тупики/кольца. Асмоди хорошо придумал с клонированием, но задача для ограниченного количества проходящих. Хотя, если развить мысль, то момент уничтожения очередного клона можно отождествлять с рождением нового в новой точке. Осталось только оптимизировать путь, который проходит нечто с момента смерти по момент рождения.
#17
by Asmody
тогда раздать всем маркеры - красный и цветной каждому свой. Коридор по еоторому вошли отмечаем красным, коридор куда уходим отмечаем своим цветом. Если попали в тупик, то возвращаемся назад на шаг. Если есть незакрашенные коридоры, идем туда, если нет - садимся и плачем.
#18
by ws_mason
А мне бы наоборот. Алгоритм создания лабиринта, с тонкими стенками, не по клеточкам.
#19
by 18plus
деление идущих на развилках + отмечать уже топтанные дорожки, если текущий идущий наткнулся на хоженную дорожку - его дезинтегрируем и двигаем остальных.
#20
by Asmody
Не, не плачем, идем еще на шаг назад. Кто-то выйдет из лабиринта, остальные врнутся ко входу.
#28
by Ёпрст
ну, запускать несколько волн с разных точек, только зачем ? Когда он один сам всё найдёт (выход, т.е)
#34
by Эмбеддер
на самом деле если зайти в лабиринт и идти вдоль любой стены, постоянно поворачивая в ее сторону, мы никогда не зациклимся. исходное расположение -у в входа, сама площадь лабиринта - прямоугольная. кто не согласен - нарисуйте свой вариант в качестве примера
#35
by Эмбеддер
+ т.е. я имею в виду, что вариант полностью правильный и зациклиться не получится)))
#37
by aka AMIGO
вообще-то - да.. неее.. я переумничал.. :) представь себе столб, любой толщины, скользим по одной стене, совершаем бесконечный цикл.. а если весь лабиринт состоит из таких "столбов", то проблема может статься длиною в жизнь :) Вот пример трех таких (стобовых :) ) образований, как решить проблему - выше моего сознания :)
#40
by Mefistophel
если идти срого по стене то на такие "столбовые" "островки" ты никогда не попадешь. Если речь про клонов на ответвлениях то там же идея с маркировкой есть, которая решает эту проблему.
#41
by Эмбеддер
если скользить например вдоль правой стены, то мы до столба никогда не дотронемся. ну, только если страртовали возле столба, так мы и выйдем сразу же из лабиринта)))
#42
by aka AMIGO
это зависит от того, когда человек, вошедший в лабиринт, опроблемился выходом :) если зашел глубоко - замучится искать стенку :)
#45
by Wasya
Алгоритмов обхода лабиринта в общем случае всего два 1) Поиск в ширину; 2) Поиск в глубину. Если иследователи лабиринта могут телепоритроваться в любую точку лабиринта, то поиск в ширину вполне подходит. В противном случае, придется использовать поиск в глубину. Но в этом случае, придется мириться, что на исследователей выпадет различная нагрузка. кто то быстро закончит свою часть исследований, а кто то будет долго блуждать по лабиринту.
#48
by Chai Nic
Ну да, но обычно задача ставится не пройти лабиринт, а выйти из него. То есть, исходная точка может где угодно оказаться, в том числе и возле "цикла" по правую/левую руку.
#49
by Лодырь
Кстати, распараллелить можно простейшим способом на два потока, используя метод встречной волны. А если есть waypoint'ы то и на большее количество потоков.
#50
by an-korot
Еще для разнообразия добавить условие, на какое расстояние видит поисковик или можно видеть на несколько клеток? )))
#52
by Domovoi
Что-то не догоняю в чем проблема? Ищем путь через рекурсию с сохранением координат прохода, когда наткнулись на тупик или на место где уже были прекращаем итерацию рекурсии. В итоге или найдем выход или определим что выхода нет. (естественно если лабиринт без телепортов и постоянен во времени) Проход по левую руку, это повыпендриваться перед 5 летним ребенком:) Реально этот метод не работает.
#58
by Torquader
Решение задачи с алгоритмом прохождения лабиринта нужно начинать с вопроса о хранении лабиринта в памяти компьютера.
#59
by Torquader
Если мы применяем правило правой или левой руки при выходе из лабиринта (когда мы неизвестно как попали в какую-то точку), то в случае наличия в лабиринте циклов правило может не позволит выйти. Если же мы применяем правило на входе в лабиринт, то даже если в нём и есть циклы и несвязные области, то мы всегда останемся в той области, которая выходит на границу - другими словами - всегда выйдем наружу снова, но или через данный вход или через другой.
#60
by Torquader
Если мы можем запоминать координаты лабиринта и "возвращаться" в нужную точку, то можно хоть построчно его анализировать - такая задача ничего общего с прохождением лабиринта не имеет. P.S. конечно, следует понимать, что лабиринт плоский и не имеет ходов на разных уровнях по высоте - задача прохождения трёхмерного лабиринта кардинально отличается о прохождения двухмерного (хотя, в случае, с возможностью "запоминания" маршрута можно делать что угодно.
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям
В этой группе 1С
- Как в google chome запретить открывать большое количество вкладок?
- 1с 8 обмен УТ 8.1 в БП 8.2 - как частично снять ограничение по датам выгрузки
- УТ 11.1 РИБ с фильтром по подразделению - проблема с перемещениями
- перевод чисел в паскале
- Ограничение видимости номенклатуры
- Бух 2.0 Баланс, актив не равен пассиву
- Зачем нужен грамматический род для ЧислоПрописью()?
- 2008 сервер. Время компьютера отстаёт.
- не устанавливается ландшафт при печати
- соединение строки и даты в скд
- Ошибка обновления конфигурации "Бухгалтерия 3.0"
- v7: Отрицательное сальдо по счету 62.1
- список значений получить значение по представлению
- Как связать табличную часть документа и регистр накопления 1с
- Преобразование значения к типу Булево не может быть выполнено
- Подключение к почте Яндекс
- Как добавить новый документ к версионированию в УТ 11
- Использование в номенклатуре реквизита КодДляПоиска
- Запрет изменение веса штучного товара Розница 1
- Запрет редактирование печатной формы УТ 11.1