Java数独求解器编译正常但无输出问题排查求助
数独求解器无输出问题的修复方案
问题排查与修复点
1. isSafeSudoku函数的3x3网格检查逻辑错误
在检查3x3网格时,错误地使用了sudoku[row][col] == digit,正确逻辑应该是遍历网格内每个位置sudoku[i][j]。原代码中这个判断永远不成立(当前位置还未填入digit),导致所有数字都被判定为不安全,递归无法推进。
修正后的isSafeSudoku:
public static boolean isSafeSudoku(int sudoku[][], int row, int col, int digit) { // 检查列 for (int i = 0; i < 9; i++) { if (sudoku[i][col] == digit) { return false; } } // 检查行 for (int j = 0; j < 9; j++) { if (sudoku[row][j] == digit) { return false; } } // 检查3x3网格 int sr = (row / 3) * 3; int sc = (col / 3) * 3; for (int i = sr; i < sr + 3; i++) { for (int j = sc; j < sc + 3; j++) { // 修正为检查网格内的每个位置 if (sudoku[i][j] == digit) { return false; } } } return true; }
2. sudokuSolver递归函数未返回已有数字位置的递归结果
当遇到已填充的数字(sudoku[row][col] != 0)时,调用递归后未返回结果,导致程序继续执行后续循环,尝试覆盖已有数字,破坏回溯逻辑。
修正后的sudokuSolver对应部分:
if (sudoku[row][col] != 0) { // 返回递归结果,直接进入下一个位置 return sudokuSolver(sudoku, nextRow, nextCol); }
3. main函数未调用打印函数
原代码仅判断是否存在解,但未调用sudokuPrint输出最终数独矩阵,这是无输出(除解存在提示)的直接原因。
修正后的main函数:
public static void main(String args[]) { int sudoku[][] = { { 0, 0, 8, 0, 0, 0, 0, 0, 0 }, { 4, 9, 0, 1, 5, 7, 0, 0, 2 }, { 0, 0, 3, 0, 0, 4, 1, 9, 0 }, { 1, 8, 5, 0, 6, 0, 0, 2, 0 }, { 0, 0, 0, 0, 2, 0, 0, 6, 0 }, { 9, 6, 0, 4, 0, 5, 3, 0, 0 }, { 0, 3, 0, 0, 7, 2, 0, 0, 4 }, { 0, 4, 9, 0, 3, 0, 0, 5, 7 }, { 8, 2, 7, 0, 0, 9, 0, 1, 3 } }; if (sudokuSolver(sudoku, 0, 0)) { System.out.println("Solution exist."); // 调用打印函数输出解 sudokuPrint(sudoku); } else { System.out.println("Solution does not exist."); } }
完整修正后的代码
public class sudoku { public static boolean isSafeSudoku(int sudoku[][], int row, int col, int digit) { // 检查列 for (int i = 0; i < 9; i++) { if (sudoku[i][col] == digit) { return false; } } // 检查行 for (int j = 0; j < 9; j++) { if (sudoku[row][j] == digit) { return false; } } // 检查3x3网格 int sr = (row / 3) * 3; int sc = (col / 3) * 3; for (int i = sr; i < sr + 3; i++) { for (int j = sc; j < sc + 3; j++) { if (sudoku[i][j] == digit) { return false; } } } return true; } public static boolean sudokuSolver(int sudoku[][], int row, int col) { // 基准条件:遍历完所有行,找到解 if (row == 9) { return true; } // 计算下一个位置 int nextRow = row, nextCol = col + 1; if (col + 1 == 9) { nextRow = row + 1; nextCol = 0; } // 当前位置已有数字,直接递归下一个位置 if (sudoku[row][col] != 0) { return sudokuSolver(sudoku, nextRow, nextCol); } // 尝试填入1-9的数字 for (int digit = 1; digit <= 9; digit++) { if (isSafeSudoku(sudoku, row, col, digit)) { sudoku[row][col] = digit; // 递归验证下一个位置,如果找到解则返回true if (sudokuSolver(sudoku, nextRow, nextCol)) { return true; } // 回溯:当前数字无法得到解,重置为0 sudoku[row][col] = 0; } } // 所有数字都尝试过,无解 return false; } public static void sudokuPrint(int sudoku[][]) { for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { System.out.print(sudoku[row][col] + " "); } System.out.println(); } } public static void main(String args[]) { int sudoku[][] = { { 0, 0, 8, 0, 0, 0, 0, 0, 0 }, { 4, 9, 0, 1, 5, 7, 0, 0, 2 }, { 0, 0, 3, 0, 0, 4, 1, 9, 0 }, { 1, 8, 5, 0, 6, 0, 0, 2, 0 }, { 0, 0, 0, 0, 2, 0, 0, 6, 0 }, { 9, 6, 0, 4, 0, 5, 3, 0, 0 }, { 0, 3, 0, 0, 7, 2, 0, 0, 4 }, { 0, 4, 9, 0, 3, 0, 0, 5, 7 }, { 8, 2, 7, 0, 0, 9, 0, 1, 3 } }; if (sudokuSolver(sudoku, 0, 0)) { System.out.println("Solution exist."); sudokuPrint(sudoku); } else { System.out.println("Solution does not exist."); } } }
运行结果说明
修正后程序会输出:
Solution exist. 2 1 8 6 9 3 7 4 5 4 9 6 1 5 7 8 3 2 7 5 3 2 8 4 1 9 6 1 8 5 7 6 3 4 2 9 3 7 4 9 2 8 5 6 1 9 6 2 4 1 5 3 7 8 5 3 1 8 7 2 6 9 4 6 4 9 3 1 8 2 5 7 8 2 7 5 4 9 6 1 3
内容的提问来源于stack exchange,提问作者Vipul
相关产品推荐
相关产品推荐

