I need to design and implement (in C or C++) a sudoku solver: such a program, given in input an incomplete (but feasible) sudoku square, should find out how to fill in the blanks in order to obtain a valid complete sudoku square.
The project is to some extent open-ended. Design choices in terms of, for instance, algorithm, structural and modular decomposition, I/O and user interface, are left to you and they are, together with the program correctness, relevant aspects of the quality of your work.
You can also test and compare several alternatives and the behaviour of your program on different input (e.g.: which algorithm is faster? how does the processing time scale when the number of blanks changes?).
Together with the code (which should be readable and commented) and some test input, you should submit a report of your activity. The report should contain: the problem description (in order to give a context to your solution), your explanation of how you dealt with the problem and with the design choices mentioned above, how you performed the program testing and anything else you find relevant.