The aspect of my code that greatly optimized the performance was the use of a hashtable that mapped keys – integers that represented a specific cell on the sudoku grid...
I decided to implement some preliminary logic before executing the backtracking because it would reduce the number of variables to change...
The possible values for every blank cell are found at the beginning of the algorithm. Whenever a change is made to the grid, the cells in the same row, column, and block are also updated right away...