我对编码很新,我现在正在编写一个递归的数独求解器。但是,我不断得到Stack Overflow错误,我不能为我的生活找出原因。
这是整个代码。错误应该在于各种解决方法。
listproductoscomponent
}
答案 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行。
所以我建议你采用一种完全不同的方法:只要你填写一个数字,你就可以在相应的行,列和框中标记该数字。这样,您不必每次都遍历所有行,列和框。当我编写一个数独求解器时,我已经取得了很好的成功,记住每个单元格仍然可以使用数字,并在开始递归和尝试每个可能的数字之前尽可能地排除它们。