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

数独验证器sudokuIsValid返回错误布尔值求助排查

数独验证器返回错误布尔值的问题

我知道大家可能不太喜欢作业类问题,但我已经为此调试了6个多小时,毫无头绪。我的数独验证器始终返回错误的布尔值,问题肯定出在sudokuIsValid函数中,但我找不到原因。

我重写了代码,也反复检查了getRow、getColumn、getSection、includes1To9这些辅助函数,确认它们功能完全正常,但sudokuIsValid函数无论输入有效还是无效数独,都只返回true。

尝试参考他人建议修改后,问题依旧:输入无效数独(如示例中的puzzleTwo)时,sudokuIsValid仍返回true,而单独调用includes1To9检测重复值时能正确返回false。

以下是我的代码:

function getRow(puzzle, row) {
// WRITE YOUR CODE HERE
return puzzle[row]
}

function getColumn(puzzle, col) {
// WRITE YOUR CODE HERE
return puzzle.map(row=>row[col])
}

function getSection(puzzle, x, y) {
// WRITE YOUR CODE HERE
let section = []
for(i = 3 * y; i < 3 * y + 3; i++){
  for(j = 3 * x; j < 3*x+3 ; j++){
    section.push(puzzle[i][j])
  }
}
return section
}

function includes1To9(arr) {
// WRITE YOUR CODE HERE
  for (i = 0; i < arr.length; i++){
    for (j = 0; j < arr.length; j++){
      if (j != i){
        if (arr[i] === arr[j]){
          return false
        }
      }
    }
  }
  return true
}

function sudokuIsValid(puzzle) {
  for (let i = 0; i < 9; i++){
    if(includes1To9(getRow) === false){
      return false
    }
  }
  for (let i= 0; i < 9; i++){
    if(includes1To9(getColumn) === false){
      return false
    }
  }
  for(let i = 0; i < 3; i++){
    for(let j =0; j < 3; j++){
      if(includes1To9(getSection) === false){
        return false
      }
    }
  }
  return true
}

// example of the puzzle that is being input and returning true, should return false

let puzzleTwo = [[ 8,9,5,  7,4,2,  1,3,6 ],
                 [ 8,7,1,  9,6,3,  4,8,5 ],
                 [ 4,6,3,  5,8,1,  7,9,2 ],

                 [ 9,3,4,  6,1,7,  2,5,8 ],
                 [ 5,1,7,  2,3,8,  9,6,4 ],
                 [ 6,8,2,  4,5,9,  3,7,1 ],

                 [ 1,5,9,  8,7,4,  6,2,3 ],
                 [ 7,4,6,  3,2,5,  8,1,9 ],
                 [ 3,2,8,  1,9,6,  5,4,7 ]];

console.log(sudokuIsValid(puzzleTwo)) // returns true should be false
console.log(includes1To9([8,8,4,9,5,6,1,7,3])) // returns false like it should

问题原因及修正

核心错误在于sudokuIsValid函数中,你没有调用辅助函数并传入必要的参数,而是直接把函数本身传递给了includes1To9。函数本身作为参数传入时,includes1To9遍历的是函数对象的属性,自然不会检测到重复值,所以始终返回true。

修正后的sudokuIsValid函数如下:

function sudokuIsValid(puzzle) {
  // 检查每一行
  for (let i = 0; i < 9; i++){
    if(includes1To9(getRow(puzzle, i)) === false){
      return false
    }
  }
  // 检查每一列
  for (let i= 0; i < 9; i++){
    if(includes1To9(getColumn(puzzle, i)) === false){
      return false
    }
  }
  // 检查每个3x3区块
  for(let i = 0; i < 3; i++){
    for(let j =0; j < 3; j++){
      if(includes1To9(getSection(puzzle, j, i)) === false){
        return false
      }
    }
  }
  return true
}

这样修改后,sudokuIsValid会正确调用每个辅助函数获取对应行、列、区块的数组,再传入includes1To9进行重复值检测,就能正常返回正确的布尔值了。

内容的提问来源于stack exchange,提问作者Ripper Reborn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:52:21