fork download
  1. E=enumerate
  2. from itertools import*
  3. M=[(0,1),(0,-1),(-1,0),(1,0)]
  4. N=len
  5. def T(v,D,d):
  6. s,c=[],0
  7. for l,X,Y in D.pop(1):s+=(l[0][1],X,Y),;c+=N(l[0][1]);D[0]+=(l[1:],X,Y),
  8. if c>v:return
  9. q=[(D[0],c,s)]
  10. while q:
  11. O,c,s=q.pop(0)
  12. if c==v:yield s
  13. elif O:
  14. q+=(O[1:],c,s),;L,X,Y=O[0]
  15. for i,(_,U)in E(L):
  16. for I in range(N(U)):q+=~i%2*(N(Q:=[j for k in L[:i]for j in k[1]]+U[:I+1]+(L[i+1][1]if-~I==N(U)and L[i+1:]else[]))+c<=v)*[(O[1:],c+N(Q),s+[(Q,X,Y)])]
  17. def B(x,y,v,d):
  18. q=[(x,y,X,Y,[])for X,Y in M]
  19. while q:
  20. x,y,X,Y,p=q.pop(0)
  21. if(V:=d.get(g:=(x+X,y+Y)))and'#'<V:q+=(*g,X,Y,p+[g]),
  22. else:yield([(a,[*b])for a,b in groupby(p,key=lambda x:d[x]!='.')],X,Y)
  23. def f(b):
  24. d={(x,y):v for x,r in E(b)for y,v in E(r)};q=[([(i,d[i])for i in d if d[i].isdigit()],d)]
  25. while q:
  26. o,d=q.pop(0);W=[]
  27. if[]==o:return d
  28. for(x,y),v in o:
  29. D={0:[],1:[]}
  30. for V,X,Y in B(x,y,v,d):
  31. if V:D[V[0][0]]+=(V,X,Y),
  32. W+=((x,y),v,[*T(int(v),D,d)]),
  33. if all(i[2]for i in W):
  34. (x,y),v,L=W[0]
  35. for w in L:
  36. D={**d}
  37. for l,X,Y in w:
  38. for j,k in l:D[(j,k)]='O'
  39. if(j+X,k+Y)in D:D[(j+X,k+Y)]='#'
  40. for X,Y in M:
  41. if'.'==D.get(H:=(x+X,y+Y)):D[H]='#'
  42. q+=(o[1:],D),
  43.  
  44. s2 = """
  45. .2.
  46. .1.
  47. ...
  48. ...
  49. ...
  50. .1.
  51. """
  52. s1 = """
  53. .1..
  54. ..1.
  55. ....
  56. 22#2
  57. """
  58. s3 = """
  59. ........4
  60. ...3.1...
  61. 45...2.3.
  62. ..9......
  63. 1..6#44..
  64. ....4..5.
  65. ....4.36.
  66. 2.......6
  67. 1....4...
  68. """
  69. s4 = """
  70. ..7..#...
  71. #...8..11
  72. 2....5...
  73. ..5...48.
  74. ...#...4.
  75. .5...6...
  76. ...1.2...
  77. 2.....6.8
  78. .7..#....
  79. """
  80. s5 = """
  81. 5.3..33..
  82. ...4...23
  83. .6.6.34..
  84. ...3#....
  85. ....5..4.
  86. .5....3..
  87. 7.98.6#.3
  88. .5.6..2..
  89. ..6...2..
  90. """
  91. def PR(b,d):
  92. b=eval(str(b))
  93. for x,y in d:b[x][y]='#'if d[(x,y)]=='.' else d[(x,y)]
  94. print('\n'.join(map(''.join,b)))
  95.  
  96. def to_board(s):
  97. return [[*i]for i in filter(None, s.split('\n'))]
  98.  
  99. def F(s):
  100. b=to_board(s)
  101. PR(b,f(b))
  102. print('-'*20)
  103.  
  104. F(s1)
  105. F(s2)
  106. F(s3)
  107. F(s4)
  108. F(s5)
Success #stdin #stdout 0.68s 14192KB
stdin
Standard input is empty
stdout
O1##
##1O
OO#O
OO#2
--------------------
#OO
#O#
###
###
###
#1O
--------------------
OOO###OO4
OOO3#O#OO
OOO#OO#3O
#O9OO#O##
1#O6#OOOO
O#OOOO#OO
#OOOO#OOO
OO#O#OOO6
O#OOO4#O#
--------------------
OOOOO####
##OO8O#OO
2#OOO5###
OOO#OOOOO
OO##O##O#
#O##OOOOO
#O#1#O#OO
2O#OOOOOO
OOO###O#O
--------------------
OOOO#OOOO
OO#OO##OO
OOOO#OO#O
#O#O#OOO#
##O#OOOO#
#OOOO#O#O
OOOOOO#O3
OOOO#OO#O
O#OOO#OO#
--------------------