2011-04-28 39 views
1

對於DFS迷宮代在Java中,我想隨機其中DFS的遞歸調用發生的順序:的Java:隨機化方法遞歸的調用順序

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); 
      } 

我怎樣才能做到這一點?

+0

你想隨機選擇一個'DFS('調用,或以隨機順序調用所有四個? – mellamokb 2011-04-28 21:33:18

回答

2

切換到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; 
      } 
    } 

需要注意的是,使用這種方法,你需要循環開關,直到遇到可用的牆,然後繼續。這有點低效,但很簡單。

0

僞代碼:

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; 
     } 
    } 
} 
0

我結束了使用此:

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); 
      } 


     } 

效果很好,感謝您的答案。

+2

這怎麼能工作?你只計算一個隨機數? – 2011-04-28 22:09:51