![]() |
|
![]() ![]() ![]() |
|
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Здравствуйте.
Мне нужно разработать алгоритм для обхода препятствий, причем припятствия бывают только прямоугольной формы и могут "пересекаться", а путь может состоять только из горизонтальных и вертикальных линий. Я конечно пытался придумать что-то, но никакого обьективного алгоритма не получилось. P.S. Путь, конечно, должен быть наиболее краток. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
В смысле, препятствия - это параллепипеды что-ли ? Ими утыкана плоскость ?
И они могут пересекаться ?: _ | | | |_| ? -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Это прямоугольники на плоскости.
_| Из А в Б. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Извиняюсь, рисунок не вышел. Вот здесь красная линия - это путь.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
И у меня не вышел ;(((
Это глюк !!! Вообще, я все меньше страниц в инете с помощью IE<=5.x вижу нормально ! Постоянно какие-то ошибки... Ну это я так, нашло что-то ;) Так прямоугольники на плоскости, но непересекаются ? А что ты имел в виду под вертикальными линиями (вверх ?) Или имеется в виду движение по плоскости ? Вообще это вроде бы "Транспортная задача". Меня как-то один фанат Пролога? (извиняюсь, не помню точно названия) убеждал, что этот язык - the best для этого... -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Да этот експлорер меня принудит на Оперу перейти... Прямоугольники пересекаются, как видно на рисунке (те два, что справа внизу). Задача не транспортная. В транспортной задаче нет траектории перевозок, только длина. Под линииями я подразумевал просто возможные направления (вверх, вниз, влево, вправо только не под углом <> 90, 180, 270, 360). -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Чтобы обойти одно припятствие можно пойти направо или налево. Может это рекурсивный алгоритм? В смысле за один шаг рекурсии можно взять ситуацию, когда сталкиваемся с препятствием. Получится бинарное дерево, и если, геометрически можно увидеть один узел с другого, то соединить эти узлы.
У кого какие мысли? Поделитесь. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
piero |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2002 Репутация: нет Всего: нет |
neutrino, опиши plz точно, что есть на входе и что надо получить на выходе, вместе подумаем...
|
|||
|
||||
SetQ |
|
|||
Unregistered |
э... скажи пожалуйста, а надо ли учитывать ситуацию в которой такую траекторию невозможно построить? (точка А в замкнутом пространстве из прямоугольников).
потому что мне кажется, что рекурсия тут может сыграть злую шутку. |
|||
|
||||
neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
На входе рисунок (точнее матрица с координатами прямоугольников) и координаты двух точек (откуда и куда идти). На выход: массив с линиями траектории. Давай подумаем, буду очень рад.
Я даже о таком случае и не думал. Хммм... В таком случае нельзя попасть в точку B. Я дома подумаю над действиями в такой ситуации. Спасибо. -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
SetQ |
|
|||
Unregistered |
если ты ещё не ушёл домой:
ты прав - рекурсия. но не схемой "напрямик - препятствие - обойти", а по другому - идти сразу во все стороны. то есть пусть точка А - эпицентр, от которого расходится круглая (или лучше квадратная?) волна, ну чисто как в физике - каждая точка фронта есть источник ещё одной волны. (только пусть волна "гаснет", когда натыкается на препятствие, а не "отражается" от него :) вот чего мне приглючилось... как дальше пока не знаю |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
2SetQ: Мысль твоя мне ясна. Но если из каждой точки фронта строить все время новые "волны", то это для стэка будет хуже чем бесконечная рекурсия
![]() Ух, чуется мне, плохи мои дела ... ![]() -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Dayana |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 352 Регистрация: 6.10.2002 Где: Тель-Авив Репутация: нет Всего: 4 |
Выбираешь один путь, например все время идешь в сторону, которая ближе всего к конечному пункту. Если заходишь в тупик, то возвращаешься по шагам назад до тех пор, пока не найдешь другой путь и т.д. Если путь от А до В существует, то алгоритм конечен. А если не существует, то можно ограничить кол-вом шагов, т.е. длиной пути, которая всегда конечна. Можно пользоваться рекурсией, проверяя длину пути. Если матрица очень большая, то можно разбить матрицу над подматрицы, и выполнять каждую подматрицу рекурсией отдельно, определяя в каждой подматрицы начальный и конечный пункты...
|
|||
|
||||
SetQ |
|
|||
Unregistered |
а если ну... не в лоб? например можно делить "волну" на 2 (то есть инициировать новый "центр", рекурсию, то бишь) тогда и только тогда, когда на препятствие натыкаемся... ну и не обязательно - прям каждую точку инициировать. жирно будет, как ты правильно подметил. достаточно будет и одной точки на "отрезок" (участок волны, стиснутый между двумя препятствиями). вторая часть задачи, видимо, будет заключаться в построении угловатой линии по результатам распространения той волны, которая таки достигла точки В. это, по-моему чуть-чуть проще. (чуть-чуть) :) а для чего тебе вообще? чувствую тут попахивает стратегией, а "юниты" ну никак не хотят идти куда пошлют, не проходя сквозь стены? 2Dayana: это как? та же рекурсия но от точки В? |
|||
|
||||
Chingachguk |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 1 Всего: 18 |
Мне кажется, что решение возможно подобно алгоритму процедуры FloodFill (закраска области, окруженной замкнутой ломаной указанного цвета - Паскаль). Ей передается точка внутри области (любая, но обязательно внутри), цвет закрашивания, цвет границы. Закрашивает всю внутренность.
В принципе, это - что-то из серии рекурсии, как уже грили. В твоем случае возможно представить область между "прямоугольниками" как область закраса и тд... в процессе закраса следить, не наткнулись ли на конечную точку ?... Забей на "непрямоугольный" путь, ведь любой путь в матрице 2x2 - прямоугольный. У меня есть (свой) алгоритм типа FloodFild, он с автоматической коррекцией размера "расползающегося стека" (у меня не в стеке а в буффере рост) - на асм под пас. Или можешь дизассемблировать оригинальный Flood. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |