static int[,] Solve(int[,] sudoku)
{
var spot = NextEmpty(sudoku);
if (spot == null)
{
return sudoku;
}
for (int i = 1; i < 10; i++)
{
if (CanPut(sudoku, spot[0], spot[1], i))
{
sudoku[spot[0], spot[1]] = i;
var newSudoku = Solve(sudoku);
if (NextEmpty(newSudoku) == null)
{
return newSudoku; // solution found
}
}
}
sudoku[spot[0], spot[1]] = 0; // solution not found, backtrack
return sudoku;
}