Logi c за суммой строк / столбцов для задачи судоку - PullRequest
0 голосов
/ 25 марта 2020

Я занимаюсь с массивами и программирую программу проверки судоку. Я должен проверить сумму строк и столбцов матрицы 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 фиксированного размера судоку. Я пытаюсь связать индекс суммы с индексом строки; возможно, используя массив.

Например:

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

Идея состоит в том, что до увеличения индекса строки все столбцы должны быть проверены, но я не могу понять, что l oop для этого. Кроме того, если после того, как все столбцы были проверены и сумма равна! = 45, нет необходимости проверять другие строки, так как судоку недопустимо.

Это можно сделать с помощью простого кода, подобного следующему:

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

Является ли этот подход к проблеме правильным? Любое предложение о том, как я мог бы настроить l oop, я объяснил?

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Идея состоит в том, что перед увеличением индекса строки все столбцы должны быть проверены, но я не могу понять, что l oop делает для этого.

Эту функцию можно реализовать с помощью вложенного элемента l oop, например:

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;
    }
}

Однако для проверки куба Судоку этого недостаточно. Вам нужно улучшить логику c, проверив наличие всех чисел (0-9) в каждой строке и в каждом столбце

0 голосов
/ 25 марта 2020

Компактный способ проверки строк и столбцов может быть следующим:

// 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 за каждый ряд / кол.

...