You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:52:10