可能重复:
Java中的数独求解器,使用回溯和递归
我正在创建一个使用递归和蛮力解决数独的程序。我的关键问题是我不明白我怎么能想象到它会被卡住。
该程序的一般算法如下:
找出数独中零的数量。
在第一个 0 的位置(getNextEmpty 方法执行此操作),插入一个数字(insertnumber 检查以确保值符合数独规则,如果符合则返回 true)。
然后我进行递归调用,当不再有零时结束(n 是零的数量)。
如果程序到了卡住的地步,我必须回溯改变一块。但这怎么可能?
Cell 类实际上将要调整的单元格的位置保存在 [row, column] 格式的数组中。它具有返回与该单元格关联的行、列或更小的网格的方法。
我不是要求手持或所有代码,只要朝着正确的方向轻推就足够了,因为我对理解递归很感兴趣。
public static int[][] getSolution(int[][] grid) {
for (int i = 0; i < 9; i++) {
System.arraycopy(grid[i], 0, SolveSudoku.grid[i], 0, 9);
}// end for
int n = getZeroes();
return getSolution(n);
}//end getSolution
private static int[][] getSolution(int n) {
if (n == 0) {
return grid;
}//end if
Cell cell = getNextEmpty();
boolean fits = false;
for (int i = 0; i <= 9; i++) {
fits = insertNumber(cell, i);
if (fits) {
break;
}else {
//I do not understand what I should do here
}
}//end for
return getSolution(n - 1);
}//end getSolution