#java #random #depth-first-search #maze
#java #Случайный #поиск в глубину #Лабиринт
Вопрос:
Для генерации лабиринта DFS в Java я хочу рандомизировать порядок, в котором выполняются рекурсивные вызовы DFS:
for (int rows=i; rows<M; rows )
for (int cols=j; cols<N; cols ){
if(northValid)
{
DFS(iNorth,j);
}
if(southValid){
DFS(iSouth,j);
}
if(eastValid){
DFS(i, jEast);
}
if(westValid){
DFS(i,jWest);
}
Как я могу это сделать?
Комментарии:
1. Вы хотите случайным образом выбрать один из этих
DFS(
вызовов или вызвать все четыре в случайном порядке??
Ответ №1:
Включите вызов класса Random:
Random r = new Random();
for (int rows=i; rows<M; rows )
for (int cols=j; cols<N; cols ) {
bool found = false;
while (!found)
switch (r.next() % 4) {
case 0: if(northValid) { DFS(iNorth,j); found = true; } break;
case 1: if(southValid) { DFS(iSouth,j); found = true; } break;
case 2: if(eastValid) { DFS(i, jEast); found = true; } break;
case 3: if(westValid) { DFS(i, jWest); found = true; } break;
}
}
Обратите внимание, что, используя этот подход, вам нужно перебирать переключатель, пока он не упрется в доступную стену, а затем продолжить. Это немного неэффективно, но довольно просто.
Ответ №2:
Псевдокод:
for (int rows=i; rows<M; rows )
{
for (int cols=j; cols<N; cols )
{
// Generate a random number between 0 to 3 => %4
switch(randomNumber)
{
case 0: DFS(iNorth,j);
break;
// ...
case 3: DFS(i,jWest);
break;
default: break;
}
}
}
Ответ №3:
В итоге я использовал это:
Double lottery = Math.random();
for (int rows=i; rows<M; rows )
for (int cols=j; cols<N; cols ){
if (lottery>=0.5D){
if(northValid)
{
DFS(iNorth,j);
}
if(southValid){
DFS(iSouth,j);
}
if(eastValid){
DFS(i, jEast);
}
if(westValid){
DFS(i,jWest);
}
}
else if (lottery<0.5D)
{
if(westValid){
DFS(i,jWest);
}
if(eastValid){
DFS(i, jEast);
}
if(southValid){
DFS(iSouth,j);
}
if(northValid)
{
DFS(iNorth,j);
}
}
Сработало хорошо, спасибо за ответы.
Комментарии:
1. Как это может работать? Вы вычисляете только одно случайное число?