Простейший алгоритм генерации лабиринта

Создаем лабиринт, входные параметры – тут будут указатели на координаты входа и выхода.
Код не оптимален, не быстр и вообще используется только до тех пор, пока руки до него не дойдут.
int TMap::MakeGoodLab2(int *x,int *y,int *xe,int *ye)
{
int x1,x2,y1,y2;
int len;
//Выделяем память под копию карты, для быстродействия
char *copy = new char[w*h];
//Окружаем карту по периметру непроходимым барьером.
MakeBorder();
//рисуем сетку – расчерчиваем карту на квадраты 3x3
for(int j=3;j<h;j+=3)
for(int i=3;i<w;i+=3) {
for(int k=0;k<3;k++)
Map[(j-k)*w+i]=1;
for(int k=0;k<3;k++)
Map[(j)*w+i-k]=1;
}
//сохраняем шаблон в памети
memcpy(copy,Map,w*h);
//Устанавливаем минимальное количество ходов от входа до выхода = полупериоду
int max=w+h;
while(1) { while(1){
//копируем базовый набросок на карту
memcpy(Map,copy,w*h);
//эта функция тупо по рандому c вероятности в 30% в каждой клетке ставит «дырку» и с вероятностью 10% - закрывает проход
MakeOnlyHole(30,10);
//погнали наших городских
for(register int repl=0;repl<w*h;repl++)
{
//берем рандомные координаты входа и выхода из периода [1;w-1] x [1;h-1]
x1=randoma(w-2)+1; x2=randoma(w-2)+1;
y1=randoma(h-2)+1; y2=randoma(h-2)+1;
//определяем есть ли выход
len=GetWay(x1,y1,x2,y2);
//если есть выходим из цикла
if (len>0) break;
}
//и из второго тоже
if (len>0) break;
}
//длина пути – длинна?
if (len>max) break;
//нет – уменьшаем наши требования
max--;
}
//маркируем вход и выход пустым квадратом – координаты были взяты рандомно могли и с стенки
Map[y2*w+x2]=0;
Map[y1*w+x1]=0;
//запоминаем
*x=x1;
*y=y1;
*xe=x2;
*ye=y2;
delete [] copy;
return len;
}