Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Нахождение наибольшего пути |
Автор: sQu1rr 14.11.2010, 21:17 | ||||||||
Дается лабиринт X - стена M - начало отсчета . - пустое место Проходить по пустотам можно только по общим граням ( если представить ввиде квадрата ) ( тоесть не по диагонали ) Нужно найти самое дальнее пустое место от начала отсчета и обозначить I Дело в том что из 10 проверочных заданий 2 программе выполнить не удалось точно так же как и мне ошибку в ней. Извеняйте, писал на скорую руку
Пример ввода ( первая строка: Номер задания, длина, высота )
Пример ответа ( первая строка: Номер задания )
Этот, например решить не удалось ( да и правильного ответа я не знаю )
Зааранее спасибо ;) |
Автор: DarkProg 14.11.2010, 21:28 |
Можно поинтересоваться - проблема ведь в том что программа виснет намертво при вот том втором тесте на который ответа нет, верно??? |
Автор: sQu1rr 15.11.2010, 01:19 |
![]() Голова болит, разберусь завтра |
Автор: Леопольд 15.11.2010, 13:24 | ||||||
Я правильно понимаю, что надо найти все кратчайшие пути до всех точек (стартуя от заданной) и самый длинный путь ведёт к ответу? Если да, то здесь подходит алгоритм A*. Я как-то bаловался с ним.
Node местоположение на карте. expand, возвращаёт все возможные передвижения из этой точки на один шаг, heuristic функция пусть считает расстояние от текущей точки (from) до цели (to) (лучше манхэтенское = |x2 - x1| + |y2 - y1|). В результате получаем полный путь от точки до цели в std::vector'e, его размер - 1 == длине пути (количеству нодов, по которым надо переходить). Если размер вектора == 0 (т.е. ни одного нода), значит цель недостижима. Пятнашки, вот, решал. Если хочешь посмотреть результат, то компиляй с включенной оптимизацией, иначе долго придётся ждать. У пятнашек много разных комbинаций, а A* выливается в "поиск в ширину" если цель не достижима. Т.е. он переbерёт все варианты. На карте же, их столько, сколько достижимых пустых мест. За несколько милисекунд bудет решать.
|
Автор: Леопольд 15.11.2010, 14:17 |
Вылазит за ограниченную оbласть. Если я не ошиbся... |
Автор: sQu1rr 15.11.2010, 20:00 | ||
Где, не подскажите? 10 раз код перепроверил ![]()
Вы правильно понимаете, спасибо за алгоритм, буду изучать ![]() |
Автор: Леопольд 15.11.2010, 22:15 |
Понятия не имею, я код не смотрел ![]() Не очень производительно, но зато вполне понятно. Иначе, более производительно модифицировать алгоритм А* таким образом, что-бы он работал бесцельно. Т.е. дать ему пробежаться по всей достижимой области (об этом он сам позаботится). В результате (если heuristic функция нормальная) он вычислит расстояние до всех нодов (их сортировать по расстоянию), начиная с ближайших и заканчивая самыми дальними. Взять самые удалённые, это и есть ответ. За границами достижимого, он не будет считать вообще. От heuristic много зависит. Здесь наиболее всего подходит "Манхэтенское расстояние". |x2 - x1| + |y2 - y1| |
Автор: sQu1rr 15.11.2010, 23:08 | ||||
Как нету? есть ![]() Я изучаю какраз его Мне здесь она и не нужна
Всмысле? зачем искать недостежимую цель? |
Автор: Леопольд 16.11.2010, 02:03 |
Перефразировал... Добавлено через 2 минуты и 58 секунд Не могу найти... |
Автор: sQu1rr 16.11.2010, 02:07 | ||
Что за достижимое / недастижимое пространство? Вроде все пути достижимы ![]() |
Автор: Леопольд 16.11.2010, 02:37 | ||
|
Автор: sQu1rr 16.11.2010, 08:04 |
Ладно, предположим, я понял и первого раза, просто, сразу оговорка: к любой пустой клетке есть путь. А так да, для общего случая, вы, конечно, правы ![]() |
Автор: Леопольд 16.11.2010, 10:28 | ||||||
Т.е. А*, конечно, интересен, но здесь он не нужен, он полезен при поиске кратчайшего пути из точки в точку (старт и цель). Алгоритм поясню на примере:
На следующей итерации bерём полученный вектор {map[2][2], map[3][1]} и проводим ту же процедуру со всеми точками из него. Если опять получен непустой вектор точек, то продолжаем раbотать с ним, если получен пустой, то в текущем векторе содержится результат. Конкретно в этом случае bудет раbотать так:
Это и есть поиск в ширину (полный переbор). Решение получено в один проход. Как сделать bыстрее, не знаю. Ещё есть ограничение на допустимое максимальное расстояние: оно не должно превышать uMax - 1. |
Автор: sQu1rr 16.11.2010, 15:38 | ||
Примерно тот же алгоритм, я и использовал, за исключением того что выполнил в рекурсии ![]() НО ТАМ ЕСТЬ ОШИБКА! ![]() |
Автор: Леопольд 16.11.2010, 15:42 | ||
|
Автор: sQu1rr 16.11.2010, 16:59 | ||
Спасибо за разьеснение ![]() |
Автор: sQu1rr 16.11.2010, 17:42 |
Со всем разобрался. Вопрос закрыт![]() Спасибо всем, особенно Леопольд |