数独问题的行/列之和后面的逻辑

问题描述 投票:0回答:2

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

鉴于矩阵是9x9,为了使数独有效,每行/每列的总和必须为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*/

这种解决问题的方法正确吗?关于如何设置所解释的循环的任何建议?

c arrays multidimensional-array sudoku
2个回答
0
投票

检查行和列的紧凑方法可能是:

// 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填充网格,则每行/列将获得45。


0
投票

这个想法是在增加行的索引之前,所有列都必须已经检查过,但我无法弄清楚这样做的原因。

您可以通过嵌套的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;
    }
}

但是,对于验证Sudoku Cube,这还不够。您需要通过检查每一行和每一列中所有数字(0-9)的出现来改善逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.