数独验证器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
相关产品推荐
相关产品推荐

