0]=lab [xx, yy, 0];// Об'єднаємо безлічі
}//створюємо кордон
{[xx + 1, yy, 0]=1;
lab [xx + 1, yy + 1, 0]=1; [xx + 1, yy - 1, 0]=1;
}
}
}
//пройдемо зліва направо по рядку і розставимо нижні межі
for (i=0; i lt; (xcells - 1)/2; i ++)
{= i * 2 + 1;=lab [xx, yy, 0];
//порахуємо кількість осередків без нижньої межі, що належать до поточного безлічі
cn=0; (k=0; k lt; (xcells - 1)/2; k ++)
{= k * 2 + 1; ((lab [x1, yy, 0] == tmn) amp; amp; (lab [x1, yy + 1, 0] == 0))
{++;
}
} (cn gt; 1)//якщо в поточному безлічі осередок з нижньою межею не одна (більше)
{
//вирішимо створювати нижню межу між осередками чи ні
tt=rnd.Next (0, 100); (tt gt; hor_rating)//не створимо кордон
{[xx, yy + 1, 0]=0;
}//створюємо кордон
{[xx, yy + 1, 0]=1; [xx + 1, yy + 1, 0]=1;
lab [xx - 1, yy + 1, 0]=1;
}
}
}
//скопіюємо поточний рядок в наступну
for (i=0; i lt; (xcells - 1)/2; i ++)
{= i * 2 + 1; [xx, yy + 2, 0]=lab [xx, yy, 0];// Скопіюємо осередку
lab [xx, yy + 3, 0]=lab [xx, yy + 1, 0];// Скопіюємо нижні межі [xx + 1, yy + 2, 0]=0;// Видалимо всі праві межі (lab [xx, yy + 3, 0] == 1)//якщо осередок має нижню межу
{[xx, yy + 2, 0]=0;// Видалимо її з безлічі
} [xx, yy + 3, 0]=0;// Видалимо всі нижні межі
}
}
//обробка останнього рядка=ycells - 2;
//скопіюємо поточний рядок в наступну (i=0; i lt; (xcells - 1)/2; i ++)
{= i * 2 + 1; [xx, yy, 0]=lab [xx, yy - 2, 0];// Скопіюємо осередку [xx + 1, yy, 0]=lab [xx + 1, yy - 2, 0];// Скопіюємо праві межі [xx, yy + 1, 0]=lab [xx, yy - 1, 0];// Скопіюємо нижні межі (lab [xx, yy + 1, 0] == 1)//якщо осередок має нижню межу
{[xx, yy, 0]=++ mn;// Віднесемо її до нового безлічі
}
} (i=0; i lt; (xcells - 1)/2; i ++)
{= i * 2 + 1;
//якщо поточна комірка і осередок праворуч члени різних множин
if (lab [xx, yy, 0]!=lab [xx + 2, yy, 0])
{
//видалимо праву межу [xx + 1, yy, 0]=0;
//об'єднаємо безлічі=lab [xx + 2, yy, 0];
tt=lab [xx, yy, 0];=0; (k=0; k lt; (xcells - 1)/2; k ++)
{= k * 2 + 1; (lab [x1, yy, 0] == tmn)
{[x1, yy, 0]=tt;
}
}
}
}
//очистимо проходи (j=0; j lt; (ycells - 1)/2; j ++)
{= j * 2 + 1; (i=0; i lt; (xcells - 1)/2; i ++)
{= i * 2 + 1; [xx, yy, 0]=0;
}
}
//відновимо кордону по периметру (i=0; i lt; xcells; i ++)
{[i, 0, 0]=1; [i, ycells - 1, 0]=1;
} (i=0; i lt; ycells; i ++)
{[0, i, 0]=1; [xcells - 1, i, 0]=1;
} [xstart - 1, ystart - 1, 0]=2; [xstop - 1, ystop - 1, 0]=3;
//з сусідньою (з входом) осередки приберемо стінку
if (xstart == 1) lab [xstart, ystart - 1, 0]=0; (ystart == 1) lab [xstart - 1, ystart, 0]=0; (xstart==xcells) lab [xstart - 2, ystart - 1, 0]=0; (ystart == ycells) lab [xstart - 1, ystart - 2, 0]=0;
//з сусідньою (з виходом) осередки приберемо стінку
if (xstop == 1) lab [xstop, ystop - 1, 0]=0; (ystop == 1) lab [xstop - 1, ystop, 0]=0; (xstop==xcells) lab [xstop - 2, ystop - 1, 0]=0; (ystop == ycells) lab [xstop - 1, ystop - 2, 0]=0;
}
//Хвильовий алгоритм
//іпользуются в процесі пошуку виходу з лабіринту
public void Volna ()
{i, j;
//елементи масиву lab [i, j, 1] містять значення довжини хвилі лабіринту
//ініціалізіруем їх значеннями - 1 (i=0; i lt; xcells; i ++)
{(j=0; j lt; ycells; j ++)