我有一个完美适用于9x9 sudokus的数独求解器。我想让它与9x6 sudokus和其他尺寸一起工作。是否可以改变这个功能?
您可以看到“9”始终是硬编码的。所以我尝试将这些值更改为9和6,但结果在我的解决方案中只有0。
所以在我继续讨论这个之前,是否可以更改它以支持不同的网格尺寸而不改变功能?
public boolean solve(int i, int j, int[][] cells) {
if (i == 9) {
i = 0;
if (++j == 9) {
return true;
}
}
if (cells[i][j] != 0)
{
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;
return false;
}
public static boolean legal(int i, int j, int val, int[][] cells) {
for (int k = 0; k < 9; ++k) // rij
{
if (val == cells[k][j]) {
return false;
}
}
for (int k = 0; k < 9; ++k) // kolom
{
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;
}
答案 0 :(得分:1)
最原始的数独游戏是2x2数独游戏
1 2
2 1
你有两个解决方案,每一行都有一个数字,每一列都有一个数字。
另一个例子是3x2
1 2
2 3
3 1
这是不可解决的,因为并非所有数字都出现在每一行中。
同样,9x6不会在每一行中都有每个数字。
因此无法解决问题,这不是数独。