N-2 在数独 for 循环中做什么来验证块 JavaScript
What is N-2 doing in the Sudoku for loop to validate the block JavaScript
我正在研究数独解决方案验证器算法的解决方案并遇到了这个示例。代码可以工作并验证,但我不明白的是为什么在 for 循环中要验证一个块有 N-2?如果 N = 9 并且棋盘是 9 * 9 那么为什么需要将其更改为 7?
当我删除 -2 并只保留 N 时,我在控制台中看不到任何变化。
这里是linkhttps://www.geeksforgeeks.org/check-if-given-sudoku-solution-is-valid-or-not/
谢谢!!
<script>
// JavaScript program to implement
// the above approach
var N = 9;
// Function to check if all elements
// of the board[][] array store
// value in the range[1, 9]
function isinRange(board)
{
// Traverse board[][] array
for(var i = 0; i < N; i++)
{
for(var j = 0; j < N; j++)
{
// Check if board[i][j]
// lies in the range
if (board[i][j] <= 0 ||
board[i][j] > 9)
{
return false;
}
}
}
return true;
}
// Function to check if the solution
// of sudoku puzzle is valid or not
function isValidSudoku(board)
{
// Check if all elements of board[][]
// stores value in the range[1, 9]
if (isinRange(board) == false)
{
return false;
}
// Stores unique value
// from 1 to N
var unique = Array(N+1).fill(false);
// Traverse each row of
// the given array
for(var i = 0; i < N; i++)
{
unique = Array(N+1).fill(false);
// Traverse each column
// of current row
for(var j = 0; j < N; j++)
{
// Stores the value
// of board[i][j]
var Z = board[i][j];
// Check if current row
// stores duplicate value
if (unique[Z])
{
return false;
}
unique[Z] = true;
}
}
// Traverse each column of
// the given array
for(var i = 0; i < N; i++)
{
// Initialize unique[]
// array to false
unique = Array(N+1).fill(false);
// Traverse each row
// of current column
for(var j = 0; j < N; j++)
{
// Stores the value
// of board[j][i]
var Z = board[j][i];
// Check if current column
// stores duplicate value
if (unique[Z])
{
return false;
}
unique[Z] = true;
}
}
// Traverse each block of
// size 3 * 3 in board[][] array
for(var i = 0; i < N - 2; i += 3) //<====== what is the point of N-2? What is it doing?
{
// j stores first column of
// each 3 * 3 block
for(var j = 0; j < N - 2; j += 3) //<====== what is the point of N-2? What is it doing?
{
// Initialize unique[]
// array to false
unique = Array(N+1).fill(false);
// Traverse current block
for(var k = 0; k < 3; k++)
{
for(var l = 0; l < 3; l++)
{
// Stores row number
// of current block
var X = i + k;
// Stores column number
// of current block
var Y = j + l;
// Stores the value
// of board[X][Y]
var Z = board[X][Y];
// Check if current block
// stores duplicate value
if (unique[Z])
{
return false;
}
unique[Z] = true;
}
}
}
}
// If all conditions satisfied
return true;
}
// Driver Code
var board = [ [ 7, 9, 2, 1, 5, 4, 3, 8, 6 ],
[ 6, 4, 3, 8, 2, 7, 1, 5, 9 ],
[ 8, 5, 1, 3, 9, 6, 7, 2, 4 ],
[ 2, 6, 5, 9, 7, 3, 8, 4, 1 ],
[ 4, 8, 9, 5, 6, 1, 2, 7, 3 ],
[ 3, 1, 7, 4, 8, 2, 9, 6, 5 ],
[ 1, 3, 6, 7, 4, 8, 5, 9, 2 ],
[ 9, 7, 4, 2, 1, 5, 6, 3, 8 ],
[ 5, 2, 8, 6, 3, 9, 4, 1, 7 ] ];
if (isValidSudoku(board))
{
document.write("Valid");
}
else
{
document.write("Not Valid");
}
</script>
这是因为代码的工作步骤为 3
for(var i = 0; i < N - 2; i += 3)
可以看到 i += 3
所以我 = 0, 3, 6
因为 N = 9 -> 9-2 = 7 -> 6 大于 7
稍后在代码中您可以看到循环 k 和 l,这是处理 3x3 矩阵
数独包含子块,每个子块是 3X3
因此,代码循环遍历每个子块中的第一个单元格,然后遍历每个 sub-block 单元格。
代码的作者添加了 N-2 条件,因此当他遍历 sub-block 单元格时
Var X = i+k;他确保他不会访问超出绑定的单元格。
然而,当数独中的列数和行数是 3 的倍数时,此检查就没有用了。
这就是为什么当你删除 -2 时你看不出有什么不同。
我正在研究数独解决方案验证器算法的解决方案并遇到了这个示例。代码可以工作并验证,但我不明白的是为什么在 for 循环中要验证一个块有 N-2?如果 N = 9 并且棋盘是 9 * 9 那么为什么需要将其更改为 7?
当我删除 -2 并只保留 N 时,我在控制台中看不到任何变化。
这里是linkhttps://www.geeksforgeeks.org/check-if-given-sudoku-solution-is-valid-or-not/
谢谢!!
<script>
// JavaScript program to implement
// the above approach
var N = 9;
// Function to check if all elements
// of the board[][] array store
// value in the range[1, 9]
function isinRange(board)
{
// Traverse board[][] array
for(var i = 0; i < N; i++)
{
for(var j = 0; j < N; j++)
{
// Check if board[i][j]
// lies in the range
if (board[i][j] <= 0 ||
board[i][j] > 9)
{
return false;
}
}
}
return true;
}
// Function to check if the solution
// of sudoku puzzle is valid or not
function isValidSudoku(board)
{
// Check if all elements of board[][]
// stores value in the range[1, 9]
if (isinRange(board) == false)
{
return false;
}
// Stores unique value
// from 1 to N
var unique = Array(N+1).fill(false);
// Traverse each row of
// the given array
for(var i = 0; i < N; i++)
{
unique = Array(N+1).fill(false);
// Traverse each column
// of current row
for(var j = 0; j < N; j++)
{
// Stores the value
// of board[i][j]
var Z = board[i][j];
// Check if current row
// stores duplicate value
if (unique[Z])
{
return false;
}
unique[Z] = true;
}
}
// Traverse each column of
// the given array
for(var i = 0; i < N; i++)
{
// Initialize unique[]
// array to false
unique = Array(N+1).fill(false);
// Traverse each row
// of current column
for(var j = 0; j < N; j++)
{
// Stores the value
// of board[j][i]
var Z = board[j][i];
// Check if current column
// stores duplicate value
if (unique[Z])
{
return false;
}
unique[Z] = true;
}
}
// Traverse each block of
// size 3 * 3 in board[][] array
for(var i = 0; i < N - 2; i += 3) //<====== what is the point of N-2? What is it doing?
{
// j stores first column of
// each 3 * 3 block
for(var j = 0; j < N - 2; j += 3) //<====== what is the point of N-2? What is it doing?
{
// Initialize unique[]
// array to false
unique = Array(N+1).fill(false);
// Traverse current block
for(var k = 0; k < 3; k++)
{
for(var l = 0; l < 3; l++)
{
// Stores row number
// of current block
var X = i + k;
// Stores column number
// of current block
var Y = j + l;
// Stores the value
// of board[X][Y]
var Z = board[X][Y];
// Check if current block
// stores duplicate value
if (unique[Z])
{
return false;
}
unique[Z] = true;
}
}
}
}
// If all conditions satisfied
return true;
}
// Driver Code
var board = [ [ 7, 9, 2, 1, 5, 4, 3, 8, 6 ],
[ 6, 4, 3, 8, 2, 7, 1, 5, 9 ],
[ 8, 5, 1, 3, 9, 6, 7, 2, 4 ],
[ 2, 6, 5, 9, 7, 3, 8, 4, 1 ],
[ 4, 8, 9, 5, 6, 1, 2, 7, 3 ],
[ 3, 1, 7, 4, 8, 2, 9, 6, 5 ],
[ 1, 3, 6, 7, 4, 8, 5, 9, 2 ],
[ 9, 7, 4, 2, 1, 5, 6, 3, 8 ],
[ 5, 2, 8, 6, 3, 9, 4, 1, 7 ] ];
if (isValidSudoku(board))
{
document.write("Valid");
}
else
{
document.write("Not Valid");
}
</script>
这是因为代码的工作步骤为 3
for(var i = 0; i < N - 2; i += 3)
可以看到 i += 3
所以我 = 0, 3, 6
因为 N = 9 -> 9-2 = 7 -> 6 大于 7
稍后在代码中您可以看到循环 k 和 l,这是处理 3x3 矩阵
数独包含子块,每个子块是 3X3
因此,代码循环遍历每个子块中的第一个单元格,然后遍历每个 sub-block 单元格。
代码的作者添加了 N-2 条件,因此当他遍历 sub-block 单元格时 Var X = i+k;他确保他不会访问超出绑定的单元格。
然而,当数独中的列数和行数是 3 的倍数时,此检查就没有用了。
这就是为什么当你删除 -2 时你看不出有什么不同。