我对以下代码片段有疑问。这是我在 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 也让我困惑。我了解行和列检查器,这些很简单,但这里的逻辑让我无法理解。
最佳答案
row
和 col
可以是 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,c
到 r+2,c+2
(含)的每个位置,查找指定的值 number
.
关于java - 了解数独解算器的各个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60311879/