私は数独ソルバーを作成しましたが、数独が解ける場合は問題なく動作します。ただし、数独が解決できない場合は、バックトラック時にパズルの元の番号が変更されます。
bool Sudoku::solve(int row, int col){
if (board[row][col] != 0){
    int next_col = col;
    int next_row = row;
    next_col++;
    if (next_col > 8){
        next_row++;
        next_col = 0;
    }
    if (next_row > 8){
        return true;
    } else {
        if (solve(next_row, next_col))
            return true;
    }
}
for (int number = 1; number <= 9; number++){
    board[row][col] = number;
    if (check_row(row, number)
     && check_col(col, number)
     && check_box(row, col, number)){
        int next_row = row;
        int next_col = col+1;
        if (next_col > 8){
            next_col = 0;
            next_row++;
        }
        if (next_row > 8){
            return true;
        }
        if (solve(next_row, next_col))
            return true;
     }
}
board[row][col] = 0;
return false;
}
ボードは2Dint配列です。整数の代わりにある種の構造を使用できることは知っています。整数が元々そこにあったかどうかを格納しますが、このソリューションは私にはあまり魅力的ではありません。他に方法はありますか?