Java Sudoku强力解算器,它是如何工作的?

时间:2015-11-26 10:41:52

标签: java brute-force

所以你在这里找到下面的代码。我理解的大多数代码,但有一点我不知道。我们创建名为digits的布尔数组的位置和3 * (x / 3)之后的位。

我认为它曾用于检查数独中的每个方格是否也有9个唯一数字,但我不知道如何解释这个问题让我们说旁边有人我。

为什么我需要这里的布尔数组?有人可以向我解释它在做什么以及为什么?

亲切的问候!

public int[][] solvePuzzle(int[][] matrix) {
    int x, y = 0;

    boolean found = false;

    // First we check if the matrix contains any zeros.
    // If it does we break out of the for loop and continue to solving the puzzle.
    for (x = 0; x < 9; x++) {
        for (y = 0; y < 9; y++) {
            if (matrix[x][y] == 0) {
                found = true;
                break;
            }
        }

        if (found) {
            break;
        }
    }

    // If the puzzle doesn't contain any zeros we return the matrix
    // We now know that this is the solved version of the puzzle
    if (!found) {
        return matrix;
    }

    boolean digits[] = new boolean[11];

    for (int i = 0; i < 9; i++) {
        digits[matrix[x][i]] = true;
        digits[matrix[i][y]] = true;
    }

    int boxX = 3 * (x / 3), boxY = 3 * (y / 3);
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            digits[matrix[boxX + i][boxY + j]] = true;
        }
    }

    // We loop over all the numbers we have to check if the next number fits in the puzzle
    // We update the matrix and check recursively by calling the same function again to check if the puzzle is correct
    // If it's not correct we reset the matrix field to 0 and continue with the next number in the for loop
    for (int i = 1; i <= 9; i++) {
        if (!digits[i]) {
            matrix[x][y] = i;

            if (solvePuzzle(matrix) != null) {
                return matrix;
            }

            matrix[x][y] = 0;
        }
    }

    // The puzzle can't be solved so we return null
    return null;
}

2 个答案:

答案 0 :(得分:1)

我在内联评论中添加了一些解释:

|0>

答案 1 :(得分:1)

似乎有两个问题你不清楚:

  1. 布尔数组 - 此数组用于跟踪特定行或列上已使用的数字。因此,想象一下一行勾选框,每行都有一个写在其旁边的数字(数组索引) - 这些框被选中或取消选中以显示是否使用了数字。

  2. 表达式3 *(x / 3)和3 *(y / 3) - 你需要记住的是这是整数除法(这意味着除法的结果总是向下舍入到例如,如果x = 1,则3 (x / 3)为3 (1/3)为3 *(0)= 0(如果这是浮点除法,则结果为3 * (0.3333)= 1.所以这些数学表达式实质上将你的数字改为三的下一个最低倍数 - 即1 - > 0,2 - > 0,3 - > 3,4 - > 3等< / p>