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

为何这段数独有效性检查代码能检测二维数组内数字重复?

数独有效性检查代码逻辑疑问解答

数独有效性检查代码

//checking validity of sudoku solution
bool validityCheck (int sudoku [25][25], int n, int sqrt_n) {
     //checking rows validity
     for (int i=0; i<n; ++i) { // i means place in column
        bool numCounter [25] = { false };
        for (int j=0; j<n; j++){  //j means place in row
            if (numCounter[(sudoku[i][j])-1] == true){
                return false;
             }
            else {
                numCounter[(sudoku[i][j]) -1] = true;
            }
        }
     }
     //checking columns validity
     for (int j=0; j<n; ++j) {
        bool numCounter [25] = {false};
        for (int  i = 0; i<n; ++i){
            if (numCounter[sudoku[i][j]-1] == true){
                return false;
             }
            else {
                numCounter[sudoku[i][j]-1]=true;
            }
        }
    }
    //checking square validity
    for (int s = 0; s < sqrt_n; s++) { //s means square in column
        for (int r = 0; r < sqrt_n; r++) {//r means square in row
            bool numCounter [25] = {false};
            int j = sqrt_n * s;
            for ( ; j < sqrt_n; ++j) {
                int  i = sqrt_n * r;
                for ( ; i < sqrt_n; ++i){
                    if (numCounter[sudoku[i][j]-1] == true){
                        return false;
                     }
                    else {
                        numCounter[sudoku[i][j]-1]=true;
                    }
                }
            }
        }
    }

    return true;
}

问题与解答

这段数独有效性检查代码通过布尔数组判断二维数组的行、列及子方格中是否存在重复数字。我认为其逻辑是:布尔数组初始值均为false,若某数字(例如4)重复出现,第一次遍历会将对应下标位置设为true,第二次检测到该位置为true时就返回false。请问我的这一理解是否正确?

你的理解完全正确。

代码核心逻辑就是利用布尔数组的标记特性:

  • 针对每一行、每一列、每一个子方格,都会初始化一个全为false的布尔数组numCounter
  • 遍历对应区域内的数字时,将数字减1作为数组下标(适配数组从0开始的索引规则,数独数字范围是1~n)
  • 如果该下标对应的数组值已经是true,说明这个数字之前已经出现过,直接返回false表示数独无效;否则将该下标位置设为true,标记该数字已出现

另外需要注意:代码中的子方格检查部分存在逻辑错误,内层的j循环条件应为j < sqrt_n * (s + 1),i的循环条件应为i < sqrt_n * (r + 1),否则只能遍历每个子方格的前sqrt_n个元素(实际只覆盖了子方格的第一行/列),无法完整检查整个子方格内的数字是否重复。

内容的提问来源于stack exchange,提问作者Razi Al Ashhab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:57:09