программа "Лабиринт". Помогите с решением

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Kerghan
Сообщения: 4
Зарегистрирован: 20 авг 2004, 23:39
Откуда: void
Контактная информация:

Romeo, отличный алгоритм кстати ;) . Можно оптимизировать чуть при желании - запоминать координаты последних измененных соседей, чтобы не отыскивать их потом по всей таблице(ну это актуально лишь для достаточно больших матриц).

Я когда-то делал иначе, причем с реальным лабиринтом =). Попытаюсь описать на уровне идеи.
1. В начальную ячейку пишем "1",кладем координаты начальной ячеки в очередь(массив, или связный список структур, включающих в себя координаты ячейки; очередь имеет голову и хвост - указатели на последний внесенный элемент и первый)
2. Достаем из очереди координаты ячейки; затем пробегаем вверх по массиву от этой ячейки, пока не "упремся в стену" или край лабиринта или значение, которое хотим записать больше того, что уже есть в клеточке. Каждый раз увеличиваем значение при каждом перемещении на одну клеточку и записываем в клеточку; кладем координаты этой клеточки в очередь. Аналогично двигаемя вправо влево и вниз.
3. Если хвост "догнал" голову, останавливаемся, иначе смотри п.2. В итоге, будем иметь заполненный массив с длинами путей(кратчайших) до всех ячеек лабиринта, или нули(или что там по умолчанию) для ячеек, путей к которым нету.

Работает это дело примерно так: сначала у нас где-то есть единница. Потом от нее "вырисовывается крестик 123456....." . Потом заполняются строки и столбцы, перпендикулярные сторонам "крестика" и тд. Как найти обратный путь уже предложил Romeo (я тоже так искал.)
Исходничек у меня де-то валялся, на Паскале правда. Если сильно нада - могу попробовать поискать =)...
Hater
Сообщения: 4
Зарегистрирован: 01 ноя 2004, 06:12

Исходничек у меня де-то валялся, на Паскале правда. Если сильно нада - могу попробовать поискать =)...
Слушай, если не сложно, кинь мне этот исходник на мыло. Если, конечно, не сложно, и если найдёшь. Мне и на Паскале подобный исходник не помешает. Заранее спасибо. 515_hatesmyself@rambler.ru
_Gemini
Сообщения: 17
Зарегистрирован: 28 дек 2004, 14:59
Откуда: Ростов-на-Дону
Контактная информация:

Hater, Алгоритм описанный Romeo, называется волновым - так что делаешь поиск в своем любимом поисковике по запросу "волновой алгоритм" - и воаля :-)) Вот что мне первым попалось - реализация как на С так и на Паскале http://algolist.manual.ru/games/wavealg.php
_Gemini
Сообщения: 17
Зарегистрирован: 28 дек 2004, 14:59
Откуда: Ростов-на-Дону
Контактная информация:

Но вообще лучше самому с нуля написать - IMHO
Ответить