背景
我已经实现了一个数独求解算法(回溯),代码如下:
//Backtracking-Algorithm
public static boolean solver(int[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == 0) {
for (int n = 1; n < 10; n++) {
if (checkRow(board, i, n) && checkColumn(board, j, n) && checkBox(board, i, j, n)) {
board[i][j] = n;
if (!solver(board)) {
board[i][j] = 0;
} else {
return true;
}
}
}
return false;
}
}
}
return true;
}
这个解决方案运行良好(可以解决数独)。
我的目标
我现在想要实现的是,算法告诉我是否只有一个解或多个解。
我尝试过的方法
我尝试通过将返回类型更改为int并计算可能的解决方案(在2处停止,因为如果有两个解决方案,我可以说有“多个”解决方案)。 所以基本上,我只想知道是否没有、一个或多个解决方案:
// Backtracking-Algorithm
public int solver(int[][] board, int count) { //Starts with count = 0
if (count < 2) {
for (int i = 0; i < GRID_SIZE; i++) {
for (int j = 0; j < GRID_SIZE; j++) {
/*
* Only empty fields will be changed
*/
if (board[i][j] == EMPTY) {
/*
* Try all numbers between 1 and 9
*/
for (int n = 1; n <= GRID_SIZE; n++) {
/*
* Is number n safe?
*/
if (checkRow(board, i, n) && checkColumn(board, j, n) && checkBox(board, i, j, n)) {
board[i][j] = n;
if (solver(board, count) > count) {
count++;
} else {
board[i][j] = 0;
}
}
}
return count;
}
}
}
return count + 1;
}
return count;
}
问题在于count
总是变成“1”,然后算法停止。
问题:
需要对代码进行哪些更改才能使其正常工作?