Я не знаю, являются ли это единственными ошибками, но на первый взгляд я думаю, что вместо
if (count == 1 && arr[r][c] == 0) {
tempNum = num;
}
else {
tempNum = 0;
}
count++;
это должно быть
count++;
if (count == 1) {
tempNum = num;
}
и вместо
if (count == 1 && check(r, c, num) && arr[r][c] == 0) {
arr[r][c] = tempNum;
это должно быть
if (count == 1 && check(r, c, tempNum)) {
arr[r][c] = tempNum;
или просто
if (count == 1 ) {
arr[r][c] = tempNum;
, поскольку, если count==1
, то check(r, c, tempNum)
не может быть ложным, если ваш check
функция не имеет побочных эффектов.
Кстати, код становится намного лучше читаемым, если вы организуете его следующим образом:
for (int r = 0; r < MAX_ROW; r++) {
for (int c = 0; c < MAX_COL; c++) {
if(arr[r][c] != 0)
continue;
// ** no tests for arr[r][c] == 0 in this code block any more
// ...
}
}
И еще одна вещь: вы должны остановить алгоритм, есличисло нулей во внешнем цикле больше не меняется от одной итерации к следующей, будет SuDoKus, который ваш решатель не может решить, и вы, я думаю, не хотите заводить свою программу в бесконечный цикл для них.