During my first year of engineer preparatory cycle for entrance into engineering school, we had to create an automatic Sudoku solver in C++.
We start by providing an initial grid for the program. It then fills in all the boxes it can, taking into account the rules used in Sudoku.

Then, thanks to the new grid, it can repeat the operation and try to fill in other boxes.

It continues this operation as long as the grid is not resolved or it is no longer possible to fill boxes (which can happen when several final grid solutions are possible)

Indeed, for the more complicated grids, the program asks the player to fill in a box himself, to choose one of the final grid possibilities. Once this has been done, the program resumes its analysis and finishes solving the grid
The project sources are available on my Github