Java数独验证程序故障:无法识别相邻重复数字求助
解决数独验证程序无法识别相邻重复数字的问题
嘿,我来帮你排查这个数独验证的问题!你提到程序在5×4位置有相邻重复的8时还返回true,大概率是检查逻辑里有疏漏,下面我从行列检查和3×3区块检查两个方向帮你分析常见问题,再给出修正后的代码示例:
一、先排查行列检查的常见错误
很多时候问题出在没有遍历整行/整列的所有元素,或者误将当前元素和自己比较后跳过了重复判断。如果你的行检查逻辑只做了相邻元素对比(比如仅比较j和j+1),或者循环范围写错,就会出现相邻重复没被识别的情况。
给你一个靠谱的行列检查逻辑示例:
// 检查某一行是否存在重复数字 private boolean isRowValid(int[][] board, int row) { boolean[] seen = new boolean[10]; // 数独数字是1-9,索引0留空不用 for (int col = 0; col < 9; col++) { int num = board[row][col]; if (num == 0) continue; // 空白格直接跳过(如果你的数独允许空白的话) if (seen[num]) { return false; // 发现重复数字,返回无效 } seen[num] = true; // 标记该数字已出现 } return true; } // 检查某一列是否存在重复数字 private boolean isColValid(int[][] board, int col) { boolean[] seen = new boolean[10]; for (int row = 0; row < 9; row++) { int num = board[row][col]; if (num == 0) continue; if (seen[num]) { return false; } seen[num] = true; } return true; }
这种用布尔数组记录已出现数字的方式,能确保整行/整列的所有数字都被检查到,不管是相邻还是非相邻的重复都不会漏掉。
二、3×3区块检查的常见坑
区块检查最容易出错的是区块起始坐标的计算,以及没有遍历区块内所有9个元素。比如你要检查(row, col)所在的区块,起始行应该是row / 3 * 3,起始列是col / 3 * 3(Java整数除法是向下取整,刚好能定位到区块左上角),然后遍历区块内的3×3范围。
正确的区块检查逻辑示例:
// 检查(row, col)所在的3×3区块是否存在重复 private boolean isBoxValid(int[][] board, int row, int col) { int boxStartRow = row / 3 * 3; int boxStartCol = col / 3 * 3; boolean[] seen = new boolean[10]; for (int i = boxStartRow; i < boxStartRow + 3; i++) { for (int j = boxStartCol; j < boxStartCol + 3; j++) { int num = board[i][j]; if (num == 0) continue; if (seen[num]) { return false; } seen[num] = true; } } return true; }
三、整合完整的验证逻辑
最后把三个检查模块整合到主方法里,遍历整个9×9数组:
public boolean isValidSudoku(int[][] board) { // 检查所有行 for (int row = 0; row < 9; row++) { if (!isRowValid(board, row)) { return false; } } // 检查所有列 for (int col = 0; col < 9; col++) { if (!isColValid(board, col)) { return false; } } // 检查所有3×3区块 for (int row = 0; row < 9; row += 3) { for (int col = 0; col < 9; col += 3) { if (!isBoxValid(board, row, col)) { return false; } } } return true; }
额外提醒:注意数组索引的问题
你提到的“5×4位置”要留意:Java数组是0索引开头的,如果你是按日常1开头的坐标描述的,那对应的数组索引应该是row=4、col=3,别搞混了导致测试时的位置不对哦。
你可以把自己原来的检查方法和上面的示例对比一下,看看是不是循环范围、重复判断逻辑或者区块坐标计算出了问题,应该就能解决相邻重复没被识别的问题啦!
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

