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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:50:18