Я пытаюсь написать программу, которая даст пользователю головоломку судоку для решения. Но я застрял на сокрытии чисел по уровню сложности. Как я могу это сделать?
Учитывая, что у вас есть матрица целых чисел 9×9
int sudoku[9][9];
и эта матрица заполнена правильной судоку, просто замените некоторые записи на 0, например. Помните, что судоку часто симметричны вокруг своего центра.
// Hide (i,j) from solution
sudoku[i][j] = 0;
sudoku[8-i][8-j] = 0;
Каждый раз, когда вы прячете два числа от решения, проверяйте с помощью своего решателя, что оно все еще может быть решено. Наконец, связать трудности с определенным количеством циклов такого процесса
for (k=0; k < difficulty; ) {
// randomly select (i,j) so that:
// - 0 <= i <= 4
// - 0 <= j <= 4
// - (i,j) != (4, 4)
// - solution[i][j] != 0 (i.e., (i, j) has not already been randomly selected
save1 = solution[i][j];
solution[i][j] = 0;
save2 = solution[8-i][8-j];
solution[8-i][8-j] = 0;
if (!can_be_solved(solution)) {
// (i, j) was not a good choice!
solution[i][j] = save1;
solution[8-i][8-j] = save2;
}
else {
// it's still OK, let's go one step further
k += 1;
}
}
//
}
Вы можете написать решатель судоку, а затем просто случайным образом сгенерировать доски судоку и проверить, действительны ли они с вашим решателем судоку. В вашем методе, который генерирует доски, у вас может быть вход, который определяет количество чисел, которые будут показаны на начальной доске. Взгляните на стандартное количество чисел для разных трудностей и основывайте его на этом.