2014-02-25 53 views
1

我收到一个错误的StackOverflow当过我运行该程序,而不是寻找骑士之旅。任何想法是什么导致了这一点,以及我如何改变我的代码,实际上找到骑士之旅,摆脱这个错误。项目是为我的CS280类,并在周五到期,请帮助。谢谢!!骑士之旅的Java

public class KnightsTourDriver { 
    public static void main (String[]args) { 
     KnightsTour tour1 = new KnightsTour; 
     tour1.findTour(1); 
     tour1.displayTour(); 
    } 
} 



import java.util.Arrays; 
class KnightsTour 
{ 

    static int the_board[][] = new int[8][8]; 
    int the_tour[][] = new int [8][8]; 
    int k,moves = 0; 
    int x = 0, y = 0; 
    int z, j = 1; 
    boolean tour_found, isSafe; 

     //fills 2D array with 0's 
     public KnightsTour() 
     { 
      for (int i = 0; i < 8; i++) 
       { 
       for (int r = 0; r < 8; r++) 
        { 
          the_board[i][r] = 0; 
         } 
       } 
     } 
     /*recursive method, checks how many moves were made if 16 were made tour finished, 
     else if not moves knight checks if the move is valid if not back tracks*/ 
     public void findTour(int q) 
     { 

      if(moves == 64) 
       { 
        tour_found = true; 
       } 

      else 
       move(q); 

      if(isSafe == true) 
        { 
         findTour(q++); 
         moves++; 
        } 
      else 
       if(isSafe == false) 
        { 
         findTour(q*(-1)); 
         moves--; 
        } 
     } 
     //used to keep prevent arrayindexoutofbounds error 
     public boolean arrayInBounds(int x, int y) 
     { 
     if(x < 8 && y < 8 && x >= 0 && y >= 0) 
       { 
        return true; 
       } 
      else return false; 
     } 
     /*move method uses switch statement to decide which move the knight should make 
     based on a case number, negative case numbers back track knight. if statement checks 
     if the current array element is empty and the index is inbounds*/ 
     public void move(int a) 
     { 

      switch (a) 
      { 
       case 1: 
       if(arrayInBounds(x+2, y+1) == true){ 
        if(the_board[x+2][y+1] != 0){       
         the_board[x+2][y+1]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
        } 
       else isSafe = false; 
       case 2: 
       if (arrayInBounds(x+1, y+2) == true){ 
        if(the_board[x+1][y+2] != 0){    
          the_board[x+1][y+2]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
       } 
       else isSafe = false; 
       case 3: 
       if(arrayInBounds(x-1, y+2) == true){ 
        if(the_board[x-1][y+2] != 0){   
          the_board[x-1][y+2]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
       } 
       else isSafe = false; 
       case 4: 
       if (arrayInBounds(x-2, y+1) == true){ 
        if(the_board[x-2][y+1] != 0){   
          the_board[x-2][y+1]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
       } 
       else isSafe = false; 
       case 5: 
       if(arrayInBounds(x-2, y-1) == true){ 
        if(the_board[x-2][y-1] != 0){   
          the_board[x-2][y-1]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
       } 
       else isSafe = false; 
       case 6: 
       if(arrayInBounds(x-1, y-2) == true){ 
         if(the_board[x-1][y-2] != 0){      
          the_board[x-1][y-2]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
      } 
       else isSafe = false; 
       case 7: 
       if(arrayInBounds(x+1, y-2) == true){ 
        if(the_board[x+1][y-2] != 0){   
          the_board[x+1][y-2]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
       } 
       else isSafe = false; 
       case 8: 
       if(arrayInBounds(x+2, y-1) == true){ 
       if(the_board[x+2][y-1] != 0){ 
          the_board[x+2][y-1]=j; 
          j++; 
          break; 
         } 
         else isSafe = false; 
         break; 
       } 
       else isSafe = false; 
       case -1: 
         j--; 
         tryNextMove(a); 
         break; 
        case -2: 
         j--; 
         tryNextMove(a); 
         break; 
        case -3: 
         j--; 
         tryNextMove(a); 
         break; 
        case -4: 
         j--; 
         tryNextMove(a); 
         break; 
        case -5: 
        j--; 
         tryNextMove(a); 
         break; 
        case -6: 
         j--; 
         tryNextMove(a); 
         break; 
        case -7: 
         j--; 
         tryNextMove(a); 
         break; 
        case -8: 
         j--; 
         tryNextMove(a); 
         break; 
      } 
     } 
     public void tryNextMove(int m) 
     { 
      move(m++); 
     } 
     //for loop to display tour once found//   
     public void displayTour() 
     { 
      int v = 1; 
      for (int i = 0; i < 8; i++) 
       { 
       for (int e = 0; e < 8; e++) 
        {    
           if(v % 8 == 0) 
           { 
            System.out.print(the_board[i][e] + "\t"); 
            System.out.println("\n"); 
           } 
         else  
          System.out.print(the_board[i][e] + "\t"); 
          v++;     
         } 
       } 
     } 
} 
+6

堆栈跟踪将是很好,但如果你自己动手调试,这将让你瘦比任何回答,我们可以提供多很多。 –

+0

在你的'findTour'方法中查看第一组'if'条件;有没有一种途径**不会**再次递归调用'findTour'? –

+1

请了解后增量和增量运算符。也许你会看到你的错误。 – Seelenvirtuose

回答

1

如果你的算法确实需要一个大深度的递归调用,您可以传递参数给JVM在启动时增加限制堆栈大小:-Xss4m

当然,这只会延缓如果你的算法没有限制地递归,那么问题就在这里

0

你需要在你的开关case语句一些休息,否则会落空。

+0

我实现了break语句,并仍然得到这个在KnightsTour.move(KnightsTour.java:155)错误 – user2612136

+0

异常在线程 “主” java.lang.StackOverflowError的 在KnightsTour.tryNextMove(KnightsTour.java:189) --- jGRASP wedge2:用于过程退出代码是1. ---- jGRASP:操作完成。 – user2612136

+0

与if/elses案件的休息看起来不正确。你需要包含行号,以便我们可以看到189行。 – pecks