在Java中递归地解决数独字段

时间:2016-12-07 10:19:18

标签: java recursion sudoku

我正在尝试制作数独游戏。

我有一个9by9(this.model[9][9])的多维数组。

我已经制作了一些函数checkRowcheckColcheckValue来水平,垂直和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)) {
    ...

0 个答案:

没有答案