数独问题 rows/columns 之和背后的逻辑

Logic behind sum of rows/columns for Sudoku problem

我正在练习数组并编写数独检查器程序,我必须检查 9x9 矩阵的行和列的总和。

鉴于矩阵为 9x9,每个 row/column 的总和必须为 45 才能使数独有效。

最简单的方法是这样做:

/*example for rows*/
for(column=0;column<9;column++){
sum0=sum0+sudoku[0][column];
sum1=sum1+sudoku[1][column];
sum2=sum2+sudoku[2][column];
sum3=sum3+sudoku[3][column];
...
/*repeat for all 9 sums and then simply check if one of the sums is != from 45

我不喜欢这段代码,因为它只适用于这个 9x9 固定大小的数独。 我想做的是将 sum 的索引与行的索引联系起来;也许使用数组。

例如:

int sum[9];
for(column=0;column<9;column++){
sum[row]=sum[row]+sudoku[row][column]

我的想法是,在增加行的索引之前,必须检查所有列,但我不知道这样做的循环。 此外,如果在检查完所有列后总和为 !=45,则无需检查其他行,因为数独无效。

这可以用像这样的简单代码来完成:

if(sum[row]!=45){
fail_flag=1;
}
/*then stop the loop and return fail_flag*/

这种解决问题的方法是否正确?关于如何设置我解释的循环有什么建议吗?

一种检查行和列的紧凑方法可以是:

// First check lines
for(int line=0;line<9;line++){
  int sum=0;
  for(int column=0;column<9;column++){
    sum+=sudoku[line][column];
  }
  if(sum!=45){
   fail_flag=1;
   //Break will exit the loop
   break;
  }
}

// Then check column
if(fail_flag==0){
  for(int column=0;column<9;column++){
    int sum=0;
    for(int line=0;line<9;line++){
      sum+=sudoku[line][column];
    }
    if(sum!=45){
     fail_flag=1;
     //Break will exit the loop
     break;
    }
  }
}

但是,在数独的情况下,检查总和是不够的,例如如果你到处用 5 填充网格,每个 row/col.

会得到 45

The idea is that before the index of row is increased all columns must have been checked but I can't figure out the loop to do so.

您可以使用嵌套的 for 循环实现此功能,如下所示:

const int sudokuSize = 9
int sum[9];

int row, col;
for (row = 0; row < sudokuSize; row++) {
    for (col = 0; col < sudokuSize; col++) {
        sum[row] = sum[row] + sudoku[row][column]
    }
    if (sum[row] != 45) {
        fail_flag = 1;
        break;
    }
}

但是,要验证数独立方体,这还不够。您需要通过检查每行和每列中所有数字 (0-9) 的出现来改进逻辑