【发布时间】:2015-12-12 23:52:58
【问题描述】:
public static int[][] solve(int[][] input){
for (int i = 0; i < 9*9; i++){
if(input[i / 9][i % 9] != 0){
continue;
}
for (int j = 1; j <= 9; j++){
if(validNumber(input, i / 9, i % 9, j)){
input[i / 9][i % 9] = j;
solve(input);
}
}
}
return input;
}
无论初始情况如何,此方法都应通过回溯解决(可解决的)数独难题。它的工作原理是这样的:
给定一个数独谜题,它从每行的左上角迭代到二维数组的右下角。当已经有一个数字时,它会被跳过。当有一个零(空字段)时,它通过validNumber 方法计算可能的值。将第一个有效数字(从 1 到 9)放入字段中,然后方法转到下一个字段。
在这个算法中,该方法现在不知道一个有效的数字是否最终会导致谜题无法解决。
我想这样改变它:
最后,当方法完成对整个二维数组的迭代时,数组的每个条目都会被测试是否为零。
如果甚至有一个零,整个算法必须进入第一个“有效”数字的位置。现在,输入下一个“有效”数字,依此类推,直到没有零算法结束。
我在实现这个想法时遇到了一些麻烦。在我看来,某处必须有另一个 for 循环,或者类似于 goto 语句,但我不知道该放在哪里。
有什么建议吗?
【问题讨论】:
标签: java recursion backtracking