input: 
  def solve_sudoku(board):
      """Solve a given Sudoku puzzle.
      >>> board = [
      ...     [7,8,0,4,0,0,1,2,0],
      ...     [6,0,0,0,7,5,0,0,9],
      ...     [0,0,0,6,0,1,0,7,8],
      ...     [0,0,7,0,4,0,2,6,0],
      ...     [0,0,1,0,5,0,9,3,0],
      ...     [9,0,4,0,6,0,0,0,5],
      ...     [0,7,0,3,0,0,0,1,2],
      ...     [1,2,0,0,0,7,4,0,0],
      ...     [0,4,9,2,0,6,0,0,7]
      ... ]
      >>> solve_sudoku(board)
      [[7, 8, 5, 4, 3, 9, 1, 2, 6], 
       [6, 1, 2, 8, 7, 5, 3, 4, 9], 
       [4, 9, 3, 6, 2, 1, 5, 7, 8], 
       [8, 5, 7, 9, 4, 3, 2, 6, 1], 
       [2, 6, 1, 7, 5, 8, 9, 3, 4], 
       [9, 3, 4, 1, 6, 2, 7, 8, 5], 
       [5, 7, 8, 3, 9, 4, 6, 1, 2], 
       [1, 2, 6, 5, 8, 7, 4, 9, 3], 
       [3, 4, 9, 2, 1, 6, 8, 5, 7]]
      """
      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 = l[0] 
          col = l[1] 
          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
      
      if (solve(board)): 
          return [row[:] for row in board] 
      else: 
          return "No solution"
  
output:     return [row[:] for row in board] 
  else: 
      return "No solution"