2011-11-11 178 views
1

好的,所以我试图让一个Java程序来解决picross板,但我不断收到一个Stackoverflow错误。我现在只是教自己一点Java,所以我喜欢使用我所知道的东西,而不是在网上找到解决方案,尽管我的方式显然不是那么高效。我能想到解决这个问题的唯一方法就是通过一种蛮力,尝试一切可能性。事情是,我知道这个函数可以工作,因为它适用于较小尺寸的电路板,唯一的问题是,在较大的电路板上,我倾向于在函数完成之前得到错误。递归Stackoverflow错误

所以char[][] a只是与所有的X和O的游戏板。 int[][] b是一个数组,其数字分配给picross板,如游戏顶部和左侧的数字。 isDone()只是检查董事会是否与给定的数字匹配,并且shift()向下移动一列。我不想粘贴我的整个程序,所以如果你需要更多信息,请告诉我。谢谢!

我添加了代码,因为有人问。 Shift只是将一行中的所有字符移动一个单元格。

更新:我在想,也许我的代码没有旋转通过每个组合,所以它跳过了正确的答案。任何人都可以验证这实际上是尝试每种可能的组合吗?因为这将解释为什么我得到stackoverflow错误。但另一方面,在它太多之前,可以经历多少次迭代?

public static void shifter(char[][] a, int[][] b, int[] clockwork) 
{ 
    boolean correct = true; 

    correct = isDone(a, b); 

    if(correct) 
     return; 

    clockwork[a[0].length - 1]++; 

     for(int x = a[0].length - 1; x > 0; x--) 
     { 
      if(clockwork[x] > a.length) 
      { 
       shift(a, x - 1); 

       clockwork[x - 1]++; 
       clockwork[x] = 1; 
      } 

      correct = isDone(a, b); 

      if(correct) 
       return; 
     } 

    shift(a, a[0].length - 1); 

    correct = isDone(a, b); 

    if(correct) 
     return; 

    shifter(a, b, clockwork); 

    return; 
} 

public static char[][] shift(char[][] a, int y) 
{  
     char temp = a[0][y]; 

      for(int shifter = 0; shifter < a.length - 1; shifter++) 
      { 
       a[shifter][y] = a[shifter + 1][y]; 
      } 

     a[a.length - 1][y] = temp; 

    return a; 
} 
+0

经过多少迭代/递归它炸毁了? – Tom

+0

考虑使移位器成为void函数而不是返回[] []。 java中已经通过引用传递[] []。 – Tom

+0

呃,我不确定它究竟会经历多少次迭代。它看起来是5x5板的一个很好的部分。碰撞前通常可以处理多少个?我将如何去做移动无效功能? –

回答

0

检查递归调用并给出终止条件。

if(terminate condition) 
{ 
exit(); 
} 
else 
{ 
call shifter() 
} 
+0

如果终止条件,你的意思是我得到的错误,就是这样。在线程“main”java.lang.StackOverflowError中出现异常,然后它重复40次中main函数的行。我不知道你的意思是通过检查递归调用。 –

+0

您必须知道您要调用该功能的次数。 – vikky

+0

对不起,我对Java仍然很陌生。我不知道如何使用终止条件。那么最初,我打算直接为for循环解决它,但由于板的大小发生了变化,我不得不切换到递归。 –