2013-04-26 158 views
0

我有一個程序,讀取從文件中的迷宮,並把它變成一個二維數組和導航的方式,雖然使用遞歸,並放置一個P到處它一直和V每其中兩次。在我的算法的某個地方有一個問題,導致迷宮只有Vs.我已經輸入了許多println語句來嘗試調試該問題。我是Java的新手,我可能錯過了一些明顯的東西,但我無法找到我生活中的問題。迷宮遍歷算法遞歸

迷宮代碼:

public static boolean goNorth(){ 
     boolean success; 
     if(maze[currCol][currRow - 1] == CLEAR){ 
      currRow = currRow - 1; 
      maze[currCol][currRow] = PATH; 
      if (maze[currCol][currRow] == maze[finishCol][finishRow]){ 
      success = true; 
      } else { 
       success = goNorth(); 
       if(!success){ 
       success = goWest(); 
        if(!success){ 
        success = goEast(); 
         if(!success){ 
         maze[currCol][currRow] = VISITED; 
         currRow = currRow + 1; 
         } 
        } 
       } 
      } 
     } else { 
      success = false; 
    } 
    return success; 
} 

public static boolean goWest(){ 
     boolean success; 
     if(maze[currCol - 1][currRow] == CLEAR){ 
      currCol = currCol - 1; 
      maze[currCol][currRow] = PATH; 
      if (maze[currCol][currRow] == FINISH){ 
      success = true; 
      } else { 
      success = goWest(); 
       if(!success){ 
       success = goSouth(); 
        if(!success){ 
        success = goNorth(); 
         if(!success){ 
          maze[currCol][currRow] = VISITED; 
         currCol = currCol + 1; 
         } 
         } 
        } 
       } 
      } else { 
       success = false; 
     } 
     return success; 
    } 

public static boolean goEast(){ 
     boolean success; 
     if(maze[currCol + 1][currRow] == CLEAR){ 
      currCol = currCol + 1; 
      maze[currCol][currRow] = PATH; 
      if (maze[currCol][currRow] == FINISH){ 
      success = true; 
      } else { 
      success = goEast(); 
       if(!success){ 
       success = goNorth(); 
        if(!success){ 
        success = goSouth(); 
         if(!success){ 
          maze[currCol][currRow] = VISITED; 
          currCol = currCol - 1; 
          } 
         } 
        } 
       } 
      } else { 
       success = false; 
     } 
     return success; 
    } 

public static boolean goSouth(){ 
     boolean success; 
     if(maze[currCol][currRow + 1] == CLEAR){ 
      currRow = currRow + 1; 
      maze[currCol][currRow] = PATH; 
      if (maze[currCol][currRow + 1] == FINISH){ 
      success = true; 
      } else { 
      success = goSouth(); 
       if(!success){ 
       success = goEast(); 
        if(!success){ 
        success = goWest(); 
         if(!success){ 
          maze[currCol][currRow] = VISITED; 
          currRow = currRow - 1; 
          } 
         } 
        } 
       } 
      } else { 
       success = false; 
     } 
     return success; 
    } 

所需的輸出:

xxxxxxxxxxxxxxxxxxFx 
xVVVVVxPPPPPPPxxxxPx 
xVxxxxxPxxxxxPPPxxPx 
xVxxxxxPxxxxxxxPxxPx 
xVVVVVVPPPPPPxxPxxPx 
xVxxxxxxxxxxPxxPPPPx 
xxxxxxxxxxxxSxxxxxxx 

輸出我得到:

xxxxxxxxxxxxxxxxxxVx 
xVVVVVxVVVVVVVxxxxVx 
xVxxxxxVxxxxxVVVxxVx 
xVxxxxxVxxxxxxxVxxVx 
xVVVVVVVVVVVVxxVxxVx 
xVxxxxxxxxxxVxxVVVVx 
xxxxxxxxxxxxSxxxxxxx 
+0

KyleM的調試建議很好。另外,你已經寫了4個非常非常相似的函數。有什麼方法可以重寫代碼以減少重複嗎?除了讓你的代碼更易於閱讀和維護之外,像這樣凝結你的代碼常常會使錯誤更加明顯。 – 2013-04-26 03:52:58

回答

1

我已經認真閱讀了您的解決方案。你的代碼的主要問題是你的遞歸是凌亂的。舉個例子:如果現在是(5,5)(除了牆的所有格子都是CLEAR),並且在你的goNorth方法中。然後,你將進入(4,5)並採用新的goNorth方法,此方法有時候會調用goSouth,但是你會再次進入(5,5)!現在圍繞(5,5)的網格不是CLEAR。你不能去任何地方(goNorth和goSouth等將返回false)。

所以,你看到了問題。試着想出一個新的正確的遞歸來解決這個問題。

3

你調試策略不太好,如果你改變你的調試策略,您將能夠解決您的問題。例如,您首要關心的應該是應用程序的狀態,第一次選擇了不正確的路徑(第一次V顯示它應該是P的位置)。您需要確定該點並暫停應用程序,查看重要變量的狀態。那會告訴你出了什麼問題。

我對你的建議是使用Eclipse IDE。在代碼的第一個重要部分旁邊設置一個斷點,只需雙擊該代碼行的左側(或右鍵單擊並選擇斷點選項)即可完成。然後,一旦你設置了斷點,在Eclipse中啓動調試器。您可以很容易地啓動調試器,它是工具欄中運行選項旁邊的選項。 Eclipse會在它到達斷點時自動暫停,並且可以逐步執行代碼。 Eclipse會告訴你每個變量的值,你可以使用這個信息來找出錯誤。

我很抱歉,如果你想解決你的問題,而不是建議如何解決它,但你顯然是一個初學者,我不會做你的任何恩惠做你的功課給你。無論如何,祝你好運。

Article調試在Eclipse