好的,所以我试图让一个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;
}
经过多少迭代/递归它炸毁了? – Tom
考虑使移位器成为void函数而不是返回[] []。 java中已经通过引用传递[] []。 – Tom
呃,我不确定它究竟会经历多少次迭代。它看起来是5x5板的一个很好的部分。碰撞前通常可以处理多少个?我将如何去做移动无效功能? –