Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > Поиск кратчайшего пути в лабиринте |
Автор: cloun 18.12.2011, 21:41 | ||
Всех приветствую! Делаю задание на C++ Builder 6: найти кратчайший путь в лабиринте от текущего положения до выхода. Лабиринт сделал через StringGrid, где '0' – пустая область, куда можно делать ход, '1' — препятствие. Расставил препятствия вручную, так как иначе можно получить тупиковую ситуацию. Ячейка 1А — начало лабиринта, 5Е — выход. Минимальный путь — 2B, 3C, 4D. Максимальный — 2B, 1B, 1C, 1D, 1E, 2E, 3E, 4E. После нахождения кратчайшего пути заголовку Label присваивается координаты ячеек, входящих в этот самый путь. Понятно, чтобы найти минимальный маршрут, нужно организовать цикл с использованием алгоритма (например, волнового). С этим у меня и возникли проблемы. Почитал, посмотрел похожие темы — не помогло. Возможно, программирование не для меня или сказывается маленький опыт. От не понимания, что делать дальше, посмотрел как суммировать значения всех ячеек. Надеюсь, кто-нибудь подскажет как быть дальше. С уважением, Сергей.![]()
Добавлено через 11 минут и 33 секунды нашел кое-что интересное: "Ставим в начальной точке число 2. Далее просматриваем весь массив. Если встречаем пустую клетку, у которой соседняя клетка равна 2, то ставим в эту клетку число 3. Затем ещё раз просматриваем, но уже ищем 3, а ставим 4. Это продолжается до тех пор, пока не поставим число в клетку конца пути. Если за просмотр не сделано ни одного изменения, то значит пути не существует.В полученной матрице получить все кратчайшие пути - элементарно." Попробую реализовать, как и с суммированием всех значений ячеек. |
Автор: KTatsu 24.12.2011, 21:43 | ||||||||||
Не знаю, решил автор или нет, тем не менее, вопрос не помечен как решенный. Я решил так: Таблица 10х10, нулевые ряды для имен линий, рабочее пространство лабиринта 9х9. Обзываю заголовки при создании формы:
Генерирую лабиринт, стены заполняются "X", пустые клетки остаются пустыми:
Используя принцип
И последний пункт, начиная от точки выхода ищу кратчайший путь по убыванию. Точки записываю в строки Memo. В клетках найденных точек ставлю значение "F" для наглядности, да и отладить это помогло один глюк ![]()
Единственный "косяк" в том, что в лабиринте используются диагонали, из-за этого в некоторых случаях при рассчете обратного пути получаются лишние повороты, когда можно пройти по прямой, тем не менее, путь от этого не становится длиннее по клеткам. P.S. Надеюсь более опытные программеры поправят меня, в чем я ошибся. |
Автор: artsb 27.12.2011, 07:41 |
Волновой алгоритм: http://algolist.manual.ru/maths/graphs/shortpath/wave.php и http://algolist.manual.ru/games/wavealg.php. |