Составляем лабиринты

Вообще конечно задача составить лабиринт очень проста с использованием random(), но если нужно сделать так чтобы из лабиринта был выход она уже усложняется, тем более (желательно) чтобы выход был не на соседней локации.

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

Поэтому давным-давно я нашел и использую волновой алгоритм поиска, он прост и быстр. Суть - что из из точки А испускается волна 1 и идет до стенки (и умирает), затем испускается 2 волна и до тех пор пока не наткнется на выход, поиск кратчайшего пути - это переход из минимальной волны на наиболее максимальную соседнюю.

Ну да ладно, нудная лекция окончена.

Прикол в том что нам нужно сделать лабиринт в который можно зайти с определенных точек и выйти соответственно, т.е. нам нужно что-то типа этого , чтоб из всех входов/выходов (синий цвет) можно было пройти к следующему, а положения входов/выходов у нас фиксированная т.к. мы относительно этого будем строить следующую локацию. И желательно чтобы пусть не был простым. (81x91, 3Kb)
Для этого будем считать что количество ходов должно быть большим чем 4/5 от ширины (или высоты - лабиринты у нас квадратные).

Обобщая нам нужен алгоритм входящими данным которого являются размеры, и вектор точек, до которых можно будет пройти.