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
相关产品推荐
相关产品推荐

