input: from typing import List
  
  def solve_sudoku(board: List[List[int]]) -> List[List[int]]:
      """
      Solves a given Sudoku puzzle. The function uses a backtracking approach to fill in the blank cells.
      
      >>> solve_sudoku([[3, 0, 6, 5, 0, 8, 4, 0, 0], [5, 2, 0, 0, 0, 0, 0, 0, 0], [0, 8, 7, 0, 0, 0, 0, 3, 1], [0, 0, 3, 0, 1, 0, 0, 8, 0], [9, 0, 0, 8, 6, 3, 0, 0, 5], [0, 5, 0, 0, 9, 0, 6, 0, 0], [1, 3, 0, 0, 0, 0, 2, 5, 0], [0, 0, 0, 0, 0, 0, 0, 7, 4], [0, 0, 5, 2, 0, 6, 3, 0, 0]])
      [[3, 1, 6, 5, 7, 8, 4, 9, 2], [5, 2, 9, 1, 3, 4, 7, 6, 8], [4, 8, 7, 6, 2, 9, 5, 3, 1], [2, 6, 3, 4, 1, 5, 9, 8, 7], [9, 7, 4, 8, 6, 3, 1, 2, 5], [8, 5, 1, 7, 9, 2, 6, 4, 3], [1, 3, 8, 9, 4, 7, 2, 5, 6], [6, 9, 2, 3, 5, 1, 8, 7, 4], [7, 4, 5, 2, 8, 6, 3, 1, 9]]
      """
      
      def find_vacant_cell(board, l): 
          for row in range(9): 
              for col in range(9): 
                  if board[row][col] == 0: 
                      l[0] = row 
                      l[1] = col 
                      return True
          return False
    
      def is_safe(board, row, col, num): 
          for i in range(9): 
              if board[row][i] == num or board[i][col] == num or board[(row//3)*3 + i//3][(col//3)*3 + i%3] == num: 
                  return False
          return True
    
      def solve(board): 
          l = [0, 0] 
          if not find_vacant_cell(board, l): 
              return True
          row, col = l
          for num in range(1, 10): 
              if is_safe(board, row, col, num): 
                  board[row][col] = num 
                  if solve(board): 
                      return True
                  board[row][col] = 0
          return False
    
      solve(board)
      return board
output:     def solve_sudoku(board: List[List[int]]) -> List[List[int]]:
          """
          Solves a given Sudoku puzzle. The function uses a backtracking approach to fill in the blank cells.
          
          >>> solve_sudoku([[3, 0, 6, 5, 0, 8, 4, 0, 0], [5, 2, 0, 0, 0, 0, 0, 0, 0], [0, 8, 7, 0, 0, 0, 0, 3, 1], [0, 0, 3, 0, 1, 0, 0, 8, 0], [9, 0, 0, 8, 6, 3, 0, 0, 5], [0, 5, 0, 0, 9, 0, 6, 0, 0], [1, 3, 0, 0, 0, 0, 2, 5, 0], [0, 0, 0, 0, 0, 0, 0, 7, 4], [0, 0, 5, 2, 0, 6, 3, 0, 0]])
          [[3, 1, 6, 5, 7, 8, 4, 9, 2], [5, 2, 9, 1, 3, 4, 7, 6, 8], [4, 8, 7, 6, 2, 9, 5, 3, 1], [2, 6, 3, 4, 1, 5, 9, 8, 7], [9, 7, 4, 8, 6, 3, 1, 2, 5], [8, 5, 1, 7, 9, 2, 6, 4, 3], [1, 3, 8, 9, 4, 7, 2, 5, 6], [6, 9, 2, 3, 5, 1, 8, 7, 4], [7, 4, 5, 2, 8, 6, 3, 1, 9]]
          """
          
          def find_vacant_cell(board, l): 
              for row in range(9): 
                  for col in range(9): 
                      if board[row][col] == 0: 
                          l[0] = row 
                          l[1] = col 
                          return True
              return False
        
          def is_safe(board, row, col, num): 
              for i in range(9): 
                  if board[row][i] == num or board[i][col] == num or board[(row//3)*3 + i//3][(col//3)*3 + i%3] == num: 
                      return False
              return True
        
          def solve(board): 
              l = [0, 0] 
              if not find_vacant_cell(board, l): 
                  return True
              row, col = l
              for num in range(1, 10): 
                  if is_safe(board, row, col, num): 
                      board[row][col] = num 
                      if solve(board): 
                          return True
                      board[row][col] = 0
              return False
        
          solve(board)
          return board