code: def sudoku(G):
      
      global N, N2, N4
      if len(G) == 16:              # for a 16 x 16 sudoku grid
          N, N2, N4 = 4, 16, 256
      e = 4 * N4
      universe = e + 1
      S = [[rc(a), rv(a), cv(a), bv(a)] for a in range(N4 * N2)]
      A = [e]
      for r in range(N2):
          for c in range(N2):
              if G[r][c] != 0:
                  a = assignation(r, c, G[r][c] - 1)
                  A += S[a]
      sol = dancing_links(universe, S + [A])
      if sol:
          for a in sol:
              if a < len(S):
                  G[row(a)][col(a)] = val(a) + 1
          return True
      else:
          return False
docs: Solving Sudoku
  
      :param G: integer matrix with 0 at empty cells
      :returns bool: True if grid could be solved
      :modifies: G will contain the solution
      :complexity: huge, but linear for usual published 9x9 grids