数独验证器没有返回正确的布尔值

问题描述 投票:0回答:2

我正在写一个数独验证器,但在最后遇到了一个问题。我对编码很陌生,所以请耐心等待。函数 sudokuIsValid 应该接受一个谜题(一个包含 9 个数组的数组)并检查每一列、每一行和 3x3 网格以查看它是否有效。函数 include1To9 独立运行,getColumn 运行,getRow 运行,getSection 运行。所以根据我的理解,它只是最后一个函数 sudokuIsValid。我不确定它有什么问题,可能是一分钟。我只是不认识其他写代码的人,所以我没有太多人可以问。我知道这段代码可能会写得更好。我也恳请您不要试图向我介绍新的操作员或类似的东西。请您解释一下为什么这不起作用?我不明白为什么 sudokuIsValid 没有按原样返回。感谢您的帮助。这是我的代码:

let puzzle = [[ 8,9,5,   7,4,2,   1,3,6 ],
              [ 2,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 ]];


//puzzle 2
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 ]];

//DO NOT EDIT ABOVE

function getRow(puzzle, row) {
  return puzzle[row]
};

function getColumn(puzzle, col) {
  let column = []
  for (let i = 0; i < puzzle.length; i++){
     column.push(puzzle[i][col])
}
return column
};


function getSection(puzzle, x, y) {
    x *= 3 
    y *= 3
    let cell = []
    for (let i = y; i < y + 3; i++){
       for (let j=x;j< x + 3; j++){
            cell.push(puzzle[i][j])
        
    }
}
return cell
};



function includes1To9(arr) {
    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) {
    let valid = []
    for (let i=0;i<9;i++) {
        valid.push(getRow(puzzle, i))
        valid.push(getColumn(puzzle,i))
    }
    for (let i=0;i<3;i++){
        for (let j=0; j<3; j++){
            valid.push(getSection(puzzle, i, j))
        }
    }

    for (let i=0; i < valid.length; i++) {
        if (includes1To9(valid[i]) === false){
            return false
        } else {
            return true
            }
        }

};
        
console.log(sudokuIsValid(puzzleTwo)) // returns true. But should return false because the first column has two 8's.
console.log(includes1To9([8,8,4,9,5,6,1,7,3])) // returns false, works as it should. This is also the first column of puzzleTwo which should make sudokuIsValid return false.
javascript arrays function sudoku
2个回答
1
投票

这是由于您的代码中的一个小逻辑错误,

sudokuIsValid
中的最终for循环是错误的 特别是

if (includes1To9(valid[i]) === false){
        return false
    } else {
        return true
    }
}

每当单行或单列,部分包含所有数字时,您的返回

true

把最后一个

for
改成:

for (let i=0; i < valid.length; i++) {
    if (includes1To9(valid[i]) === false){
        return false
    }
}
return true

这对我有用


-1
投票

好吧,我现在正在做同样的项目并且(尝试)我最好不要查找答案。 getSection 函数让我很困惑。为什么需要将 x 和 y 变量乘以 3,然后再加 3?部分真的让我感到困惑。

.includes() 函数也非常有用,哈哈。 Double 也,你最终通过 Multiverse 实习了吗?如果有,它对你好吗?

© www.soinside.com 2019 - 2024. All rights reserved.