除了解决方法之外,算法中的一切似乎都正常工作。当使用可解的数独板执行程序时,它会说无法解决。我已经尝试了所有我能想到的解决方法。我已经尝试过调试,但在测试了第一行后失败了。有什么建议吗?以下是目前的完整代码:
public class SudokuSolver {
public static void initializeGrid(int[][] grid, int[][] puzzle) {
for (int r = 0; r < puzzle.length; r++) {
for (int c = 0; c < puzzle[0].length; c++) {
grid [r][c] = puzzle [r][c];
}
}
}
public static void displayGrid(int[][] grid) {
for (int r = 0; r < grid.length; r++) {
if (r % 3 == 0) {
System.out.println("+---+---+---+");
}
for (int c = 0; c < grid[r].length; c++) {
if (c % 3 == 0) {
System.out.print("|");
}
displayDigits(r, c, grid);
} System.out.print("|"); System.out.println(); } System.out.println("+---+---+---+"); }
如果 (grid[r][c] == 0) { System.out.print(' '); } else { System.out.print(grid[r][c]); } } public static int getEmptyCells(int[][] grid, int[][] emptyCells) { int i = 0; int numEmptyCells = 0; for (int r = 0; r < grid.length; r++) { for (int c = 0; c < grid[r].length; c++) { 如果 (grid[r][c] == 0) { emptyCells[i][0] = r; emptyCells[i][1] = c; numEmptyCells++; i++; } } } return numEmptyCells; }
private static boolean hasNoDuplicates(int[] digitsList) { for (int j = 0; j < digitsList.length; j++) { for (int k = j + 1; k < digitsList.length; k++) { 如果 (digitsList[j] == digitsList[k] && digitsList[j] != 0) 返回 false; } } 返回 true; }
private static boolean checkCurrentRow(int[][] grid, int currentRow) {
int[] digitsList = new int[grid.length];
for (int c = 0; c < digitsList.length; c++) {
digitsList[c] = grid[currentRow][c];
}
如果 (hasNoDuplicates(digitsList)) {
返回 true;
}
返回 false;
}
private static boolean checkCurrentCol(int[][] grid, int currentCol) { int[] digitsList = new int[grid.length]; for (int i = 0; i < digitsList.length; i++) { digitsList[i] = grid[i][currentCol]; } 如果 (hasNoDuplicates(digitsList)) { 返回 true; } 返回 false; }
private static boolean checkCurrentRegion(int[][] grid, int currentRow, int currentCol) {
int[] digitsList = new int[grid.length];
currentRow = (currentRow / 3) * 3;
currentCol = (currentCol / 3) * 3;
int i = 0;
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
digitsList[i] = grid[currentRow + r][currentCol + c];
i++;
}
}
如果 (hasNoDuplicates(digitsList)) {
返回 true;
}
返回 false;
}
public static boolean isConsistent(int[][] grid, int currentRow, int currentCol) { if (checkCurrentRow(grid, currentRow) && checkCurrentCol(grid, currentCol) && checkCurrentRegion(grid, currentRow, currentCol)) { return true; } return false; }
public static boolean solvePuzzle(int[][] grid, int[][] emptyCells, int numEmptyCells) {
int i = 0;
int j = 0;
int currentCellDigit = grid[emptyCells[i][0]][emptyCells[i][1]];
while (j < numEmptyCells) {
if (currentCellDigit != 9) {
currentCellDigit++;
grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit;
if (isConsistent(grid, emptyCells[i][0], emptyCells[i][1])) {
grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit;
i++;
j++;
}
else {
grid[emptyCells[i][0]][emptyCells[i][1]] = currentCellDigit - 1;
}
}
else {
currentCellDigit = 0;
currentCellDigit = grid[emptyCells[i][0]][emptyCells[i][1]];
i--;
j--;
if (j < 0) {
return false;
}
}
}
return true;
}
public static void main(String[] args) {
if...else
,以及缺少了displayDigits(int, int, int[][])
。 - Kröw