我发现了一些解决数独谜题的代码,但我只理解它的一部分。这个数独求解器是如何工作的?
static boolean solve(int i, int j, int[][] cells) {
if (i == 9) {
i = 0;
if (++j == 9)
return true;
}
if (cells[i][j] != 0) // skip filled cells
return solve(i+1,j,cells);
for (int val = 1; val <= 9; ++val) {
if (legal(i,j,val,cells)) {
cells[i][j] = val;
if (solve(i+1,j,cells))
return true;
}
}
cells[i][j] = 0; // reset on backtrack
return false;
}
static boolean legal(int i, int j, int val, int[][] cells) {
for (int k = 0; k < 9; ++k) // row
if (val == cells[k][j])
return false;
for (int k = 0; k < 9; ++k) // col
if (val == cells[i][k])
return false;
int boxRowOffset = (i/3)*3;
int boxColOffset = (j/3)*3;
for (int k = 0; k < 3; ++k) // box
for (int m = 0; m < 3; ++m)
if (val == cells[boxRowOffset+k][boxColOffset+m])
return false;
return true; // no violations, so it's legal
}
我明白法律()方法,它只是检查不允许的重复。不太清楚的是solve()中的递归如何完成它的工作。
任何人都可以提供有关该部分如何工作的见解。我真的很想理解它,所以我可以自己实现一个。
谢谢
你应该找到[这](http://www.norvig.com/sudoku.html)非常有趣的 - 即使它是错误的语言:) – Voo