为何这段数独有效性检查代码能检测二维数组内数字重复?
数独有效性检查代码逻辑疑问解答
数独有效性检查代码
//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; }
问题与解答
这段数独有效性检查代码通过布尔数组判断二维数组的行、列及子方格中是否存在重复数字。我认为其逻辑是:布尔数组初始值均为false,若某数字(例如4)重复出现,第一次遍历会将对应下标位置设为true,第二次检测到该位置为true时就返回false。请问我的这一理解是否正确?
你的理解完全正确。
代码核心逻辑就是利用布尔数组的标记特性:
- 针对每一行、每一列、每一个子方格,都会初始化一个全为
false的布尔数组numCounter - 遍历对应区域内的数字时,将数字减1作为数组下标(适配数组从0开始的索引规则,数独数字范围是1~n)
- 如果该下标对应的数组值已经是
true,说明这个数字之前已经出现过,直接返回false表示数独无效;否则将该下标位置设为true,标记该数字已出现
另外需要注意:代码中的子方格检查部分存在逻辑错误,内层的j循环条件应为j < sqrt_n * (s + 1),i的循环条件应为i < sqrt_n * (r + 1),否则只能遍历每个子方格的前sqrt_n个元素(实际只覆盖了子方格的第一行/列),无法完整检查整个子方格内的数字是否重复。
内容的提问来源于stack exchange,提问作者Razi Al Ashhab
相关产品推荐
相关产品推荐

