数独验证器未返回正确的布尔值
Sudoku Validator is not returning correct boolean
我正在编写一个数独验证程序,但我 运行 在它的最后遇到了一个问题。我对编码很陌生,所以请耐心等待。函数 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.
这是由于你的代码中的一个小逻辑错误,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
它对我有用
我正在编写一个数独验证程序,但我 运行 在它的最后遇到了一个问题。我对编码很陌生,所以请耐心等待。函数 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.
这是由于你的代码中的一个小逻辑错误,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
它对我有用