java - 了解数独解算器的各个部分

标签 java recursion solver sudoku

我对以下代码片段有疑问。这是我在 youtube 上找到的数独解算器。它采用递归回溯算法来求解。我只是想从中学习,但我在某些方面陷入困境。 以下代码片段是一个 boolean 值,用于检查数字是否在 3x3 框中,稍后将在solve() 方法中使用。

// we check if a possible number is in its 3x3 box
private boolean isInBox(int row, int col, int number) {
    int r = row - row % 3;
    int c = col - col % 3;

    for (int i = r; i < r + 3; i++)
        for (int j = c; j < c + 3; j++)
            if (board[i][j] == number)
                return true;

    return false;
}

我只是不明白这是如何工作的。 row - row % 3 的作用是什么?然后在 for 循环中 i < r + 3 也让我困惑。我了解行和列检查器,这些很简单,但这里的逻辑让我无法理解。

最佳答案

rowcol 可以是 0 到 8 之间的任何值。它们定义 9x9 数独游戏中的位置。

循环需要检查包含位置 row,col 的特定 3x3 框。

int r = row - row % 3; 查找同一 3x3 框中第一行的索引。

int c = col - col % 3; 查找同一 3x3 框中第一列的索引。

两者都将输入值转换为输出:

0 -> 0
1 -> 0
2 -> 0
3 -> 3
4 -> 3
5 -> 3
6 -> 6
7 -> 6
8 -> 6

然后,循环检查从 r,cr+2,c+2(含)的每个位置,查找指定的值 number.

关于java - 了解数独解算器的各个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60311879/

相关文章:

vba - 将收敛值设置为内置求解器的变量

java - 使用线程循环更新 JFrame

Python 置换程序流程帮助

templates - C++11 decltype 和模板循环中的无限递归

Matlab 相当于 Mathematica 的 FindInstance

ubuntu - 无法在 ubuntu 中安装 ipopt 3.11.1 求解器

java - APN 不发送我的一些通知

java - 为什么我可以编译出错误的代码?

java - 获取链中的所有证书;中间和根

java - 数学二十四游戏 Java