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

Java实现数独求解器遇问题:测试用例返回结果错误

数独求解器过早退出的问题排查提示

我帮你梳理几个最可能导致程序提前退出、错误返回false的常见问题,你可以逐一检查:

  • 回溯时未恢复棋盘状态:这是新手写数独求解器最容易踩的坑。当你在某个空位尝试填入一个数字后递归调用求解函数,如果递归返回false(说明这个数字走不通),你必须把当前位置重新设为空(比如恢复成0)。要是漏掉这一步,后续的遍历会带着错误的棋盘状态继续,导致程序误以为没有可行解,直接返回false。

  • 空位查找逻辑不完整:检查你查找下一个空位的代码,是不是没有完整遍历整个9x9网格?比如有没有在找到第一个空位处理后就停止遍历,或者循环条件写错(比如行/列的范围没到9),导致程序误以为所有空位都填完了,提前终止。

  • 合法性检查函数存在错误:你的isValid函数(用来判断某个数字能不能填在当前位置)可能逻辑有误。比如检查3x3宫的时候,坐标计算错误(正确的宫起始行应该是i / 3 * 3,起始列是j / 3 * 3,然后遍历这个3x3范围内的所有单元格),或者漏查了行/列里的重复数字,导致合法的数字被判定为非法,程序觉得当前位置没有可选数字,直接返回false。

  • 递归终止条件逻辑错误:确认你的终止条件是不是只有当整个网格没有空位时才返回true。如果你的代码在处理到某个空位时,没尝试完所有1-9的数字就提前返回false,或者在递归过程中错误地终止循环,都会导致程序过早退出。

给你举个典型的错误示例,看看是不是和你的代码类似:

private boolean solve(int[][] board) {
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (board[i][j] == 0) {
                for (int num = 1; num <= 9; num++) {
                    if (isValid(board, i, j, num)) {
                        board[i][j] = num;
                        if (solve(board)) {
                            return true;
                        }
                        // 这里遗漏了恢复棋盘状态的代码!
                        // board[i][j] = 0;
                    }
                }
                // 这里直接返回false,但如果上一层还有其他数字可以尝试,就会提前终止
                return false;
            }
        }
    }
    return true;
}

你可以重点对照这几个点检查你的代码,应该能找到问题所在。

内容的提问来源于stack exchange,提问作者Sant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:06:09