//checking validity of sudoku solution
bool validityCheck (int sudoku [25][25], int n, int sqrt_n) {
//checking rows validity
for (int i=0; i<n; ++i) { // i means place in column
bool numCounter [25] = { false };
for (int j=0; j<n; j++){ //j means place in row
if (numCounter[(sudoku[i][j])-1] == true){
return false;
}
else {
numCounter[(sudoku[i][j]) -1] = true;
}
}
}
//checking columns validity
for (int j=0; j<n; ++j) {
bool numCounter [25] = {false};
for (int i = 0; i<n; ++i){
if (numCounter[sudoku[i][j]-1] == true){
return false;
}
else {
numCounter[sudoku[i][j]-1]=true;
}
}
}
//checking square validity
for (int s = 0; s < sqrt_n; s++) { //s means square in column
for (int r = 0; r < sqrt_n; r++) {//r means square in row
bool numCounter [25] = {false};
int j = sqrt_n * s;
for ( ; j < sqrt_n; ++j) {
int i = sqrt_n * r;
for ( ; i < sqrt_n; ++i){
if (numCounter[sudoku[i][j]-1] == true){
return false;
}
else {
numCounter[sudoku[i][j]-1]=true;
}
}
}
}
}
return true;
}
大家好,这段代码使用 bool 来判断一个数字是否在二维数组的行、列或平方根中重复。 是不是一开始bool被设置为false,如果假设值4被重复,那么首先它变成true,然后再次检查并发现它是true,所以我们知道它已经被重复并返回false? 我想我明白了,只是确定一下。
基本上,它有一个包含从1到26的所有号码的清单,检查该号码是否已被使用,如果没有则写入它。
因此,numCounter 是一个包含 25 个布尔值的数组,因为每行只有 25 个数字(1 到 26)。 数组中的每个布尔值都指示索引处的数字是否已被使用。 所以线条
if (numCounter[(sudoku[i][j])-1] == true){
return false;
}
else {
numCounter[(sudoku[i][j]) -1] = true;
}
首先检查该数字是否已被使用,如果有,则返回函数一个 false,表示数独不正确;如果不是,则通过将 bool 值设置为 true 来将其设置为已使用的。 在这种情况下,该行
sudoku[i][j]
返回数组数独中实际行位置 (j) 的实际列 (i) 中的数字。这应该给你一个 1 到 26 之间的数字。然后你输入 -1,因为数组从 0 而不是 1 开始。