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