![]() |
|
![]() ![]() ![]() |
|
neutrino |
|
||||||||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Это BackTracking? Напоминает задачу "обход конем шахматной доски". Вообше, по-моему, это пока единственный способ, оптимальный для заqдачи.
А как волну строить? Спираль вокруг точки обводить, пока не наткнусь на что-нибудь? Хотя это будет ближайшее препятствие. Направить волну в сторону точки назначания? А если там тупик, она загасится (из правила выведенного в предыдушем сообшении).
Ты знаешь, я всегда думал: как эта процедура работает так быстро? Может это и подойдет.
![]()
Да нет. Программированием игр не увлекаюсь. Мне это нужно для того, чтобы соединить два блока в блок-схеме, обойдя остальные блоки. ![]() Всем огромное спасибо за ответы! Рассмотрю все ваши идеи. И не знал, что так много будет. Результаты опубликую здесь. -------------------- The truth comes from within ... Покойся с миром, Vit |
||||||||||
|
|||||||||||
December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
А такая идея (безусловно, не оптимальная, но простая в реализации):
Если войти в лабиринт и идти, всё время держась правой (левой, кому больше нравится) рукой за стенку, то в конце концов выйдешь наружу. Copyright Lewis Carrol, если не изменяет память. Предлагаю найти такой путь, а потом его оптимизировать - проверять на пересечения с самим собой, возможности срезать путь и т. д. По-моему, быстро будет. |
|||
|
||||
podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Neutrino
А ты литературой по данному вопросу интересовался? А то у меня книжка есть, там описаны два алгоритма поиска пути в лабиринте. Думаю, на земле обетованной ее (книжку) не найдешь. Если надо - кинь на е-мейл, куда тебе слить отсканированные страницы. Только ящик укажи пообъемнее. А я уж поработаю со сканером. А потом всем расскажешь. |
|||
|
||||
neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Я такую программу писал. Если ты с ней знаком, то должен знать, что если ты идешь вокруг "островка лабиринта", то "вытягиваешь" другую руку и идешь "шюпая" стену по другой стороне. Тут она не подойдет, т.к. эти блоки - сплошные островки.
Да, про поиски этой книжки тут, ты прав. Здесь ничего не найдешь. А вообше если ты думаешь, что там есть что-нибудь полезное для этой задачи, и если тебе не впадлу, то давай. Не очень мне хочется тебя принуждать к черной работе. А мыло мое есть в профиле. Хотя: [email protected]. Thnx -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: нет Всего: 57 |
Буду очень благодарен, если мне тоже вышлешь. [email protected] Уточнение: рисуется кратчайший путь (т.е. без учёта препятствий, прямой отрезок), потом по нарисованному пути последовательно перебираются шаги до встречи препятствия. Препятствие обходится с вытянутой рукой, далее процедура повторяется. По достижении пункта назначения весь путь проверяется на наличие петель и прочих несуразностей. Лично я уже не вижу недостатков в таком варианте. Хотя они, наверно, есть. |
|||
|
||||
podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Ребята, я помогу, но вам придется чуть-чуть подождать: на работе грохнули систему, ищем дрова для сканера. Немножко терпения!
![]() |
|||
|
||||
piero |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2002 Репутация: нет Всего: нет |
Выяснилось , что задача эта- упрощённый вариант алгоритма Дейкстры. Решается свё просто. Пусть на матрице пустые клетки - нули, прямоугольники- минус единицы(для удобства). Так в точке А мы начинаем- ставим там 1,
в четырёх соседних точках, не равных -1, ставим 2, и так рекурсивно заполняем все точки, увеличивая значение на каждом шаге. Если значение точке Б ни разу не поменялось, то туда дороги нет, если поменялось, то идём обратно 10, 9, 8, т.д- семейство таких путей и будет найкратчайшими траекториями. Вот. Всё доказано. ![]() |
|||
|
||||
podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
||||
|
||||
SetQ |
|
|||
Unregistered |
ну, блин, в этом мире просто невозможно придумать что-то новое
интересно, что это за "блок-схема" такая с пересекающимися блоками? |
|||
|
||||
piero |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2002 Репутация: нет Всего: нет |
neutrino, обрати plz внимание на мою мессагу на две позиции выше, а то она потеряется напрочь из виду, а ведь это на самом деле точное решение
![]() |
|||
|
||||
neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Не, бойся ![]() Пока я скажу, что алгоритм "с волнами", наверное не подойдет. Алгоритм с рекурсией (и бэктрэкингом) Dayanы, тоже.
Просто и такое бывает. ![]() -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
И так, постараюсь подвести итоги. В обшем можно классифицировать алгоритмы на две группы:
1) алгоритм Dayanы, December'а и мой (с бинарным деревом); 2) алгоритм Chingachguka, "волновой" алгоритм (SetQ), алгоритм Piero. В принципе они все похожи. Вопрос в том, что как в алгоритме Piero (Дейксры) все таки найти путь по полученной "сетке" из точек "1"? А ведь это и впрямь похоже на FloodFill. Мне нужно, чтобы путь был с наименьшим количеством поворотов (менее изломлен). А в алгоритме Dayanы, можно прийти к ситуации, когда путь мы найти не сможем: если мы идем пока не наткнемся на тупик, то когда мы на него натыкаемся, возвращяемся обратно, а возможно в аналогичной ситуации нужно обойти препятствие. Пока мы все пути не опробуем, этого сделать нельзя. Хочу еще привести такую идею: допустим мы построили бинарное дерево обхода препятствий по всем возможным путям. Далее, чтобы выбрать нужный путь, надо взять самую короткую ветвь дерева. В узле можно писать сколько пикселей прошли до него. Только я не совсем понимаю, как это дерево строить. Опыта с деревьями у меня нет. P.S. Хочу выразить благодарность всем участникам темы. Эх, жили бы вы здесь, я бы вас на пиво позвал, А Dayan'у на коктейль, что Vit посоветовал (да муж, наверняка не пустит, он ведь не программист) ![]() P.P.S. Я ... это... тему не закрываю, просто расчувствовался ... ![]() -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Shaman |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 13.4.2002 Где: Минск Репутация: нет Всего: нет |
Да как два байта переслать ![]() Сначала по-подробнее опишу алгоритм... 0)заводим счётчик=1 и значение клетки начала=1 остальные 0 если свободно -1 если препятствие 1)Цикл по всем клеткам Для любой клетки а)if значение>0 или <0 то следующая клетка б)if значение==0 то если все клетки вокруг <=0 то следующая клетка иначе если есть соседняя клетка==счётчик то значение равно счётчик+1. конец цикла 2)счётчик++ 3)Проверка конца пути если там не 0 то переходим непосредственно к поиску пути. Если не изменилось значение ни одной клетки, то путь не существует 4)Поиск пути: осматриваем все соседние с концом пути клетки и исчем клетку значение в которой меньше на единицу. Такая всегда есть (если такая не одна то берём отбалдовую). Затем выполняем эту же процедуру с вновь найденой клеткой и.т.д. в итоге получаем клетку с номером 1-начло пути. Координаты клеток найденых таким образом дадут путь. Вот... Алгоритм является упрощённой версией Алгоритма Дейкстры, который является оптимальным для нахождения кратчайшего пути в графах. Никаких рекурсий одни циклы... Совет: при реализации лучше использовать матрицу увеличенную на строку сверху и снизу и стиолбец слева и справа, забитый минус единицами. Т.е. мы как бы окаймляем матрицу -1. Цикл проводиь по внутренней матрице. Если делать так то при проверке соседних клеток не придётся проверять выход за границы матрицы. Для того чтобы уменьшить количество изломов можно придумать коофицент поворота т.е. при присвоении значения клетке приповороте увеличивать значение на 3 или больше а при прямом пути на 1. Но в любом случае сожет оказаться что ломаный путь меньше прямого ![]() Вобщем если тебя интересует такой алгоритм с коофицентом то я могу выслать ихсодничек в паскале... p.s.
Ну так ничего не выдет по такому принципу можно не заблудится в лабиринте т.е. выйти откуда пришёл. Принцип валится на нулевом примере: гордый блок посреди поля дойти нужно в угол этого поля а стартовая точка возле блока. Тогда держась правой/левой рукой можно ходить вокург блока до бесконечности. p.p.s. Господа, изучайте фундаментальную торию алгоритмов, в ней есть ответы на вопросы над которыми мы все мучаемся придумывая велосипед в очередной раз... |
||||
|
|||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Вот это результат работы алгоритма, если я правильно понял.
Здесь самая темная полоса - путь. Препятствия - "-1", Слабый серый цвет обозначает множество возможных (наикротчайших) ходов. Вопрос в том как выбрать именно этот. Это как прямоугольники, а у них правая и нижняя стороны только. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Shaman |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 13.4.2002 Где: Минск Репутация: нет Всего: нет |
Как говорила одна моя знакомая красоту не заалгоритмируешь
![]() Вариант 1)При повороте прибавлять не 1 а 3 или больше. Плюсы: а)Быстро и изящно Минусы: Работает не всегда, замучаешься находить обратный путь Вариант 2)Создать дерево наикратчайших путей, т.е. в корень помесить координаты конца пути, детями сделать все клетки у которых значение на один меньше и.т.д. Потом обходя дерево сверху оставлять только ребёнка у которого количество попоротов минимальное. Плюсы: 100% результат и нет проблем с поиском пути Минусы: долговато и требует доп памяти. Короче всё вот так... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |