java递归数独求解器中的堆栈溢出错误

时间:2016-04-22 21:49:13

标签: java recursion stack-overflow sudoku

我对编码很新,我现在正在编写一个递归的数独求解器。但是,我不断得到Stack Overflow错误,我不能为我的生活找出原因。

这是整个代码。错误应该在于各种解决方法。

listproductoscomponent

}

1 个答案:

答案 0 :(得分:0)

我认为您无需从solvePrevious方法拨打solve

我对方法名称感到有点困惑 - “之前的”可能意味着“前一个单元格”或“同一单元格的前一个数字”。这是你可以改进的。

基本想法应如下所示:

/* in main: */
solve(0, 0, 1);

solve(row, col, num) {
  if (checkAll(row, col)) {
    solveNextCell(row, col);
  }
  if (num < n * n) {
    solve(row, col, num + 1);
  }
}

solveNextCell(row, col) {
  if (row == n - 1 && col == n - 1)
    printSolution();
  else if (col == n - 1)
    solve(row + 1, 0, 1);
  else
    solve(row, col + 1, 1);
}

这样,你只能“向前搜索”。由于这两个方法以递归方式相互调用,因此调用层次结构会隐式记住所有“先前”步骤。

但是即使这样,你的程序也会在looooooong loooooong时间运行,至少对于最初空的董事会而言。这是因为它尝试第一行的每个字段中的每个数字,即9^9 = 387420489。假设在第二行中有相似的许多位置,尝试次数增加到150094635296999121,这是一个很大的数字,我不知道如何发音。这只是第9行第2行。

所以我建议你采用一种完全不同的方法:只要你填写一个数字,你就可以在相应的行,列和框中标记该数字。这样,您不必每次都遍历所有行,列和框。当我编写一个数独求解器时,我已经取得了很好的成功,记住每个单元格仍然可以使用数字,并在开始递归和尝试每个可能的数字之前尽可能地排除它们。