The basic solving algorithm is backtracking. It is not efficient if we generate all possible configurations of numbers from 1 to 9 to fill the empty cells. Techniques such as narrowing down possible numbers can improve performance, but even without using such techniques, some programming languages can be made faster by devising data structures.
A different solving algorithm is Exact cover.
I used both algorithms.