数独3x3区块验证方法中变量i递增异常及循环次数不符问题
数独3x3区块验证代码错误排查
核心问题分析
你的代码存在两个关键问题:
1. 循环嵌套与比较逻辑冗余且错误
- 四层循环会导致重复比较:比如单元格(i,j)会和(k,l)比较一次,当循环到(k,l)时又会和(i,j)再比较一次,产生大量无效判断。
- 判断条件
i != k && j != l逻辑错误:这个条件只会检测行和列都不同的单元格,漏掉了同一行不同列(i=k但j≠l)、同一列不同行(i≠k但j=l)的情况。比如区块内同一行有两个相同数字,这个条件根本不会触发判断,导致重复值无法被检测出来。
2. 未处理越界值检查
你的需求里提到要检查越界值(非1-9的数字),但当前代码完全没有这部分逻辑,会导致不符合规则的数字被放过。
修复后的代码
用集合记录已出现的数字,遍历一次区块即可完成重复值+越界值的检查,逻辑更简洁高效:
public boolean isValidBox(int row, int col) { Set<Integer> seen = new HashSet<>(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int num = grid[row + i][col + j]; // 检查越界值(数独合法值为1-9) if (num < 1 || num > 9) { return false; } // 检查重复值:add返回false说明数字已存在 if (!seen.add(num)) { return false; } } } return true; }
原代码执行次数与变量异常说明
原代码四层循环总次数是3*3*3*3=81次,你提到的243次可能是多次调用方法的累计执行次数。而你观察到的变量i递增异常,大概率是调试时的视觉误差——四层循环嵌套下,内层循环的重复执行会覆盖调试器的变量显示,实际i是按0→1→2正常递增的。
内容的提问来源于stack exchange,提问作者yanasf
相关产品推荐
相关产品推荐

