fork download
  1. from collections import defaultdict
  2. import itertools
  3.  
  4. N = 3
  5.  
  6. def solve(grid, x, y, nums, total=None):
  7. if not nums:
  8. return 1
  9.  
  10. if x == N-1:
  11. return solve(grid, 0, y+1, nums, total)
  12.  
  13. output = 0
  14.  
  15. if x == y == 0:
  16. for a,b,c,d in itertools.permutations(nums, 4):
  17. # print(a,b,c,d)
  18. grid[0,0], grid[0,1], grid[1,0], grid[1,1] = a, b, c, d
  19. nums -= {a,b,c,d}
  20.  
  21. output += solve(grid, x+1, y, nums, a+b+c+d)
  22.  
  23. nums |= {a,b,c,d}
  24. del grid[0,0], grid[0,1], grid[1,0], grid[1,1]
  25.  
  26. elif y == 0:
  27. for a,b in itertools.combinations(nums, 2):
  28. if grid[y,x] + grid[y+1,x] + a + b == total:
  29. grid[y,x+1], grid[y+1,x+1] = a, b
  30. nums -= {a, b}
  31. output += solve(grid, x+1, y, nums, total)
  32.  
  33. grid[y,x+1], grid[y+1,x+1] = b, a
  34. output += solve(grid, x+1, y, nums, total)
  35.  
  36. nums |= {a, b}
  37. del grid[y,x+1], grid[y+1,x+1]
  38.  
  39. elif x == 0:
  40. for a,b in itertools.combinations(nums, 2):
  41. if grid[y,x] + grid[y,x+1] + a + b == total:
  42. grid[y+1,x], grid[y+1,x+1] = a, b
  43. nums -= {a, b}
  44.  
  45. output += solve(grid, x+1, y, nums, total)
  46.  
  47. grid[y+1,x], grid[y+1,x+1] = b, a
  48. output += solve(grid, x+1, y, nums, total)
  49.  
  50. nums |= {a, b}
  51. del grid[y+1,x], grid[y+1,x+1]
  52.  
  53. else:
  54. a = total - (grid[y,x] + grid[y,x+1] + grid[y+1,x])
  55.  
  56. if a in nums:
  57. grid[y+1,x+1] = a
  58. nums -= {a}
  59.  
  60. output += solve(grid, x+1, y, nums, total)
  61.  
  62. nums |= {a}
  63. del grid[y+1,x+1]
  64.  
  65. return output
  66.  
  67. print(solve({}, 0, 0, set(range(N*N))))
Success #stdin #stdout 0.1s 10288KB
stdin
Standard input is empty
stdout
376