我正在尝试制作数独游戏。
我有一个9by9(this.model[9][9]
)的多维数组。
我已经制作了一些函数checkRow
,checkCol
和checkValue
来水平,垂直和9(较小)框中检查有效性。
我创建了一个函数tryValue
,用于测试特定单元格中某个值是否有效(由行i
和col j
给出):
public boolean tryValue(int val, int i, int j) {
// check validity of row
if (!checkRow(val, i)) {
return false;
}
// check validity of column
if (!checkCol(val, j)) {
return false;
}
// check validity of box
if (!checkBox(val, i, j)) {
return false;
}
// insert value
this.model[i][j] = val;
// could not break function before, so we assume it is valid
return true;
}
现在我试图通过递归来解决数独。我试过这样做:
public static void solve(Field f, int i, int j) throws SolvedException {
if (i >= Field.SIZE) {
// we are done (base case in recursion)
} else if (j >= Field.SIZE) {
solve(f, i + 1, 0);
} else {
// if empty cell
if (f.isEmpty(i, j)) {
// try all values (i.e. values from 1 to 9)
for (int k=1; k<=9; k++) {
// if value is valid, insert value
if (f.tryValue(k, i, j)) {
// juhu!
}
}
}
// continue recursion
solve(f, i, j + 1);
}
}
但我使用
查看从1到9的所有值// try all values (i.e. values from 1 to 9)
for (int k=1; k<=9; k++) {
// if value is valid, insert value
if (f.tryValue(k, i, j)) {
...
这显然是错误的,因为我不能只检查所有值,但我需要更仔细地检查值。
我想我可能需要创建一个临时数组值,所以我可以重写值的猜测,直到可以解决数独。
所以我可能需要像
这样的东西while (tryValue(k, i, j)) {
...