Sudoku Solver - Constraint Propagation

Use three sets to track constraints: 1.1. rows[i]: digits used in row ii.

2.2. cols[j]: digits used in column jj.

3.3. boxes[i/3][j/3]: digits used in that 3×33 \times 3 box.

For each empty cell, try digits 11-99. If a digit satisfies all constraints, place it and recurse. Backtrack if no valid digit exists.