如何实现数独全部3×3区块的完整性校验?现有代码仅支持首个区块
解决数独所有3×3区块的检查问题
没问题,我来帮你调整这段代码!你的原代码只处理了左上角第一个3×3区块,而且只检查了区块内有没有重复数字,没有验证是否包含1-9的完整数值。下面是修改后的完整代码,能覆盖所有9个区块,同时满足“无重复+包含1-9全部数字”的要求:
public static boolean checkSubs(int[][] p) { // 遍历所有3×3区块的起始行(0、3、6) for (int startRow = 0; startRow < 9; startRow += 3) { // 遍历所有3×3区块的起始列(0、3、6) for (int startCol = 0; startCol < 9; startCol += 3) { int[] nums = new int[9]; int x = 0; boolean hasDuplicate = false; // 遍历当前区块内的3行3列 for (int i = startRow; i < startRow + 3; i++) { for (int j = startCol; j < startCol + 3; j++) { int temp = p[i][j]; // 检查当前数字是否已经在nums中(重复检查) for (int m = 0; m < x; m++) { if (nums[m] == temp) { hasDuplicate = true; break; } } if (hasDuplicate) break; nums[x++] = temp; } if (hasDuplicate) break; } if (hasDuplicate) { return false; } // 检查当前区块是否包含1-9的所有数字(全覆盖检查) for (int num = 1; num <= 9; num++) { boolean found = false; for (int m = 0; m < nums.length; m++) { if (nums[m] == num) { found = true; break; } } if (!found) { return false; } } } } // 所有区块都通过检查 return true; }
关键改动说明:
- 遍历所有区块:新增两层外层循环,分别控制每个区块的起始行和起始列(每次步进3,对应数独的3×3区块划分)
- 独立检查每个区块:每个区块都重新初始化
nums数组和计数器x,避免不同区块的数据互相干扰 - 补充全覆盖验证:原代码只检查了无重复,但没有确认是否包含1-9所有数字,新增的循环会逐一验证1到9是否都存在于当前区块中
- 提前终止优化:一旦发现重复或缺失数字,立即返回
false,不需要继续检查后续区块,提升效率
内容的提问来源于stack exchange,提问作者Shoug
相关产品推荐
相关产品推荐

