![]() |
|
|
![]()
|
|
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Всем привет.
Нужно алгоритм поиск пути в двовхмерном массыве(игровое поле). Вот игровое поле: playfield[10][10] - структура, где есть поле TYPE. В этом поле содержиться инфа о даной клетке: RECT_NONE - невидимая клетка. неиспользуется в игре RECT_EMPTY - пустая клетка. RECT_BALL - занятая клетка. находиться какой-то объэкт Интерфейс функции:
Помогите плз написать алгоритм поиска пути на С/С++. Прочитал алгоритмы здесь: http://pmg.org.ru/ai/stout.htm мало что понял Заранее спасибо. Это сообщение отредактировал(а) Sergio - 7.12.2008, 16:19 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
алгоритм поиска в ширину можно представить так:
вместо того, чтобы находить сразу все доступные точки, найти сначала точки, в которые можно добраться за 0 шагов, потом за 1 шаг, потом за 2, потом за 3 и т.д. если до точки можно добраться, значит рано или поздно мы её встретим за 0 шагов, естественно, можно добраться только в стартовую точку за 1 - во всех её соседей (кроме тех, через которые нельзя ходить) чтобы найти все точки, доступные за 2 шага, пробегаемся по точкам, доступным за 1 шаг и помечаем всех её соседей (кроме тех, по которым нельзя ходить), как доступные за 2 шага и так продолжаем, пока не встретим искомую точку естественно, бывают ситуации, когда точка недоступна, чтобы не зациклиться, нужно установить какой-то максимум длины пути, например - общее количество клеточек конечно же, возможна целая куча оптимизаций, но для понимания можно начать с самой простой версии Это сообщение отредактировал(а) maxim1000 - 7.12.2008, 19:05 -------------------- qqq |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Мм, может я не в тему, но разве элементарный алгоритм волны не подойдет?
Вроде он ищет оптимальнейший путь и только надо обработать случай, когда до клетки не добраться. -------------------- Всем добра |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
честно говоря, в своём владении терминологией не уверен, но, по-моему, в данном случае (т.е. невзвешенном графе) волнойов лагоритм, поиск в ширину и алгоритм Дейкстры совпадают
-------------------- qqq |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Я так понял что алгоритм поиска в ширину реализуется с помощью рекурсии..
Вот что примерно такого(поправьте если неправильно) По диагонали проходить путь нельзя:
спасибо. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Sergio, И что, он даже не циклится?
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
ksnk, а какправильно? помоги плз с реализацией
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Перебор в ширину:
Перед расчетом заводим новый массив 10x10. Прочищаем его нулями. Занятые и невидимые точки заполняем -1. Начало помечаем 1 Конец = 1000. Цикл по N++, от 1-го. { Для каждой точки, помеченной N проверяем соседей. { Если сосед ==1000 - Нашли. Если сосед ==0 - помечаем его N+1 } } Все. В результате Можно составлять список из N+1-х элементов для пущей оптимальности. Это сообщение отредактировал(а) ksnk - 8.12.2008, 00:53 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Sergio |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
ksnk, а можно побробней что это значит?
Вот что у меня пока вышло:
Не очень понимаю как это всё должно работать. Это сообщение отредактировал(а) Sergio - 8.12.2008, 17:32 |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
имя TYPE здесь не стоит использовать лучше что-то типа distance - чтобы понятнее было я бы посоветовал нарисовать на бумаге в клеточку какое-то поле (с препятствиями) и последовательно найти точки, до которых можно добраться за 1, 2, 3 и т.д. шагов -------------------- qqq |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
maxim1000, хорошо учту.
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Чего-то типа такого. На С писал давненько, проверить не на чем, может и ашипка-другая попасть...
Чтобы не сочинять массив, можно добавить в основной массив поле TMP, в котором и будем уже рисоваться...
Неоптимально, понятно, но зато должно работать Чтобы сэкономить на многократном просмотре поля - можно сочинять список клеток, которые помечены N+1 и просматривать уже только его. Это сообщение отредактировал(а) ksnk - 8.12.2008, 19:59 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| FinShark |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 18.12.2008 Репутация: нет Всего: нет |
А зачем вам собственно он нужен, что вы уже задумали?
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |