![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
sQu1rr |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Дается лабиринт
X - стена M - начало отсчета . - пустое место Проходить по пустотам можно только по общим граням ( если представить ввиде квадрата ) ( тоесть не по диагонали ) Нужно найти самое дальнее пустое место от начала отсчета и обозначить I Дело в том что из 10 проверочных заданий 2 программе выполнить не удалось точно так же как и мне ошибку в ней. Извеняйте, писал на скорую руку
Пример ввода ( первая строка: Номер задания, длина, высота )
Пример ответа ( первая строка: Номер задания )
Этот, например решить не удалось ( да и правильного ответа я не знаю )
Зааранее спасибо ;) |
||||||||
|
|||||||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
Можно поинтересоваться - проблема ведь в том что программа виснет намертво при вот том втором тесте на который ответа нет, верно???
-------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
sQu1rr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Программа дает ответ
Что не является верным |
||||
|
|||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
![]() Голова болит, разберусь завтра Это сообщение отредактировал(а) sQu1rr - 15.11.2010, 01:38 |
|||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Что значит самое дальнее? Я правильно понимаю, что надо найти все кратчайшие пути до всех точек (стартуя от заданной) и самый длинный путь ведёт к ответу? Если да, то здесь подходит алгоритм A*. Я как-то bаловался с ним.
Node местоположение на карте. expand, возвращаёт все возможные передвижения из этой точки на один шаг, heuristic функция пусть считает расстояние от текущей точки (from) до цели (to) (лучше манхэтенское = |x2 - x1| + |y2 - y1|). В результате получаем полный путь от точки до цели в std::vector'e, его размер - 1 == длине пути (количеству нодов, по которым надо переходить). Если размер вектора == 0 (т.е. ни одного нода), значит цель недостижима. Пятнашки, вот, решал. Если хочешь посмотреть результат, то компиляй с включенной оптимизацией, иначе долго придётся ждать. У пятнашек много разных комbинаций, а A* выливается в "поиск в ширину" если цель не достижима. Т.е. он переbерёт все варианты. На карте же, их столько, сколько достижимых пустых мест. За несколько милисекунд bудет решать.
Это сообщение отредактировал(а) Леопольд - 21.11.2010, 18:25 -------------------- вопросов больше чем ответов |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Вылазит за ограниченную оbласть. Если я не ошиbся...
-------------------- вопросов больше чем ответов |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Где, не подскажите? 10 раз код перепроверил ![]() Вы правильно понимаете, спасибо за алгоритм, буду изучать ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Понятия не имею, я код не смотрел
![]() Не очень производительно, но зато вполне понятно. Иначе, более производительно модифицировать алгоритм А* таким образом, что-бы он работал бесцельно. Т.е. дать ему пробежаться по всей достижимой области (об этом он сам позаботится). В результате (если heuristic функция нормальная) он вычислит расстояние до всех нодов (их сортировать по расстоянию), начиная с ближайших и заканчивая самыми дальними. Взять самые удалённые, это и есть ответ. За границами достижимого, он не будет считать вообще. От heuristic много зависит. Здесь наиболее всего подходит "Манхэтенское расстояние". |x2 - x1| + |y2 - y1| Это сообщение отредактировал(а) Леопольд - 16.11.2010, 02:42 -------------------- вопросов больше чем ответов |
|||
|
||||
sQu1rr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Как нету? есть ![]() Я изучаю какраз его Мне здесь она и не нужна
Всмысле? зачем искать недостежимую цель? |
||||
|
|||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Перефразировал...
Добавлено через 2 минуты и 58 секунд Не могу найти... -------------------- вопросов больше чем ответов |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Что за достижимое / недастижимое пространство? Вроде все пути достижимы ![]() |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это сообщение отредактировал(а) Леопольд - 16.11.2010, 02:40 -------------------- вопросов больше чем ответов |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
||||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Что-то я перемудрил тут, heuristic не нужна. A* bез heuristic это просто поиск в ширину, он всё решит. Т.е. А*, конечно, интересен, но здесь он не нужен, он полезен при поиске кратчайшего пути из точки в точку (старт и цель). Алгоритм поясню на примере:
На следующей итерации bерём полученный вектор {map[2][2], map[3][1]} и проводим ту же процедуру со всеми точками из него. Если опять получен непустой вектор точек, то продолжаем раbотать с ним, если получен пустой, то в текущем векторе содержится результат. Конкретно в этом случае bудет раbотать так:
Это и есть поиск в ширину (полный переbор). Решение получено в один проход. Как сделать bыстрее, не знаю. Ещё есть ограничение на допустимое максимальное расстояние: оно не должно превышать uMax - 1. Это сообщение отредактировал(а) Леопольд - 16.11.2010, 21:53 -------------------- вопросов больше чем ответов |
||||
|
|||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Примерно тот же алгоритм, я и использовал, за исключением того что выполнил в рекурсии ![]() НО ТАМ ЕСТЬ ОШИБКА! ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |