E=enumerate
from itertools import*
M=[(0,1),(0,-1),(-1,0),(1,0)]
N=len
def T(v,D,d):
s,c=[],0
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),
if c>v:return
q=[(D[0],c,s)]
while q:
O,c,s=q.pop(0)
if c==v:yield s
elif O:
q+=(O[1:],c,s),;L,X,Y=O[0]
for i,(_,U)in E(L):
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)])]
def B(x,y,v,d):
q=[(x,y,X,Y,[])for X,Y in M]
while q:
x,y,X,Y,p=q.pop(0)
if(V:=d.get(g:=(x+X,y+Y)))and'#'<V:q+=(*g,X,Y,p+[g]),
else:yield([(a,[*b])for a,b in groupby(p,key=lambda x:d[x]!='.')],X,Y)
def f(b):
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)]
while q:
o,d=q.pop(0);W=[]
if[]==o:return d
for(x,y),v in o:
D={0:[],1:[]}
for V,X,Y in B(x,y,v,d):
if V:D[V[0][0]]+=(V,X,Y),
W+=((x,y),v,[*T(int(v),D,d)]),
if all(i[2]for i in W):
(x,y),v,L=W[0]
for w in L:
D={**d}
for l,X,Y in w:
for j,k in l:D[(j,k)]='O'
if(j+X,k+Y)in D:D[(j+X,k+Y)]='#'
for X,Y in M:
if'.'==D.get(H:=(x+X,y+Y)):D[H]='#'
q+=(o[1:],D),
s2 = """
.2.
.1.
...
...
...
.1.
"""
s1 = """
.1..
..1.
....
22#2
"""
s3 = """
........4
...3.1...
45...2.3.
..9......
1..6#44..
....4..5.
....4.36.
2.......6
1....4...
"""
s4 = """
..7..#...
#...8..11
2....5...
..5...48.
...#...4.
.5...6...
...1.2...
2.....6.8
.7..#....
"""
s5 = """
5.3..33..
...4...23
.6.6.34..
...3#....
....5..4.
.5....3..
7.98.6#.3
.5.6..2..
..6...2..
"""
def PR(b,d):
b=eval(str(b))
for x,y in d:b[x][y]='#'if d[(x,y)]=='.' else d[(x,y)]
print('\n'.join(map(''.join,b)))
def to_board(s):
return [[*i]for i in filter(None, s.split('\n'))]
def F(s):
b=to_board(s)
PR(b,f(b))
print('-'*20)
F(s1)
F(s2)
F(s3)
F(s4)
F(s5)
RT1lbnVtZXJhdGUKZnJvbSBpdGVydG9vbHMgaW1wb3J0KgpNPVsoMCwxKSwoMCwtMSksKC0xLDApLCgxLDApXQpOPWxlbgpkZWYgVCh2LEQsZCk6CiBzLGM9W10sMAogZm9yIGwsWCxZIGluIEQucG9wKDEpOnMrPShsWzBdWzFdLFgsWSksO2MrPU4obFswXVsxXSk7RFswXSs9KGxbMTpdLFgsWSksCiBpZiBjPnY6cmV0dXJuCiBxPVsoRFswXSxjLHMpXQogd2hpbGUgcToKICBPLGMscz1xLnBvcCgwKQogIGlmIGM9PXY6eWllbGQgcwogIGVsaWYgTzoKICAgcSs9KE9bMTpdLGMscyksO0wsWCxZPU9bMF0KICAgZm9yIGksKF8sVSlpbiBFKEwpOgogICAgZm9yIEkgaW4gcmFuZ2UoTihVKSk6cSs9fmklMiooTihROj1baiBmb3IgayBpbiBMWzppXWZvciBqIGluIGtbMV1dK1VbOkkrMV0rKExbaSsxXVsxXWlmLX5JPT1OKFUpYW5kIExbaSsxOl1lbHNlW10pKStjPD12KSpbKE9bMTpdLGMrTihRKSxzK1soUSxYLFkpXSldCmRlZiBCKHgseSx2LGQpOgogcT1bKHgseSxYLFksW10pZm9yIFgsWSBpbiBNXQogd2hpbGUgcToKICB4LHksWCxZLHA9cS5wb3AoMCkKICBpZihWOj1kLmdldChnOj0oeCtYLHkrWSkpKWFuZCcjJzxWOnErPSgqZyxYLFkscCtbZ10pLAogIGVsc2U6eWllbGQoWyhhLFsqYl0pZm9yIGEsYiBpbiBncm91cGJ5KHAsa2V5PWxhbWJkYSB4OmRbeF0hPScuJyldLFgsWSkKZGVmIGYoYik6CiBkPXsoeCx5KTp2IGZvciB4LHIgaW4gRShiKWZvciB5LHYgaW4gRShyKX07cT1bKFsoaSxkW2ldKWZvciBpIGluIGQgaWYgZFtpXS5pc2RpZ2l0KCldLGQpXQogd2hpbGUgcToKICBvLGQ9cS5wb3AoMCk7Vz1bXQogIGlmW109PW86cmV0dXJuIGQKICBmb3IoeCx5KSx2IGluIG86CiAgIEQ9ezA6W10sMTpbXX0KICAgZm9yIFYsWCxZIGluIEIoeCx5LHYsZCk6CiAgICBpZiBWOkRbVlswXVswXV0rPShWLFgsWSksCiAgIFcrPSgoeCx5KSx2LFsqVChpbnQodiksRCxkKV0pLAogIGlmIGFsbChpWzJdZm9yIGkgaW4gVyk6CiAgICh4LHkpLHYsTD1XWzBdCiAgIGZvciB3IGluIEw6CiAgICBEPXsqKmR9CiAgICBmb3IgbCxYLFkgaW4gdzoKICAgICBmb3IgaixrIGluIGw6RFsoaixrKV09J08nCiAgICAgaWYoaitYLGsrWSlpbiBEOkRbKGorWCxrK1kpXT0nIycKICAgIGZvciBYLFkgaW4gTToKICAgICBpZicuJz09RC5nZXQoSDo9KHgrWCx5K1kpKTpEW0hdPScjJwogICAgcSs9KG9bMTpdLEQpLAogICAgCnMyID0gIiIiCi4yLgouMS4KLi4uCi4uLgouLi4KLjEuCiIiIgpzMSA9ICIiIgouMS4uCi4uMS4KLi4uLgoyMiMyCiIiIgpzMyA9ICIiIgouLi4uLi4uLjQKLi4uMy4xLi4uCjQ1Li4uMi4zLgouLjkuLi4uLi4KMS4uNiM0NC4uCi4uLi40Li41LgouLi4uNC4zNi4KMi4uLi4uLi42CjEuLi4uNC4uLgoiIiIKczQgPSAiIiIKLi43Li4jLi4uCiMuLi44Li4xMQoyLi4uLjUuLi4KLi41Li4uNDguCi4uLiMuLi40LgouNS4uLjYuLi4KLi4uMS4yLi4uCjIuLi4uLjYuOAouNy4uIy4uLi4KIiIiCnM1ID0gIiIiCjUuMy4uMzMuLgouLi40Li4uMjMKLjYuNi4zNC4uCi4uLjMjLi4uLgouLi4uNS4uNC4KLjUuLi4uMy4uCjcuOTguNiMuMwouNS42Li4yLi4KLi42Li4uMi4uCiIiIgpkZWYgUFIoYixkKToKIGI9ZXZhbChzdHIoYikpCiBmb3IgeCx5IGluIGQ6Ylt4XVt5XT0nIydpZiBkWyh4LHkpXT09Jy4nIGVsc2UgZFsoeCx5KV0KIHByaW50KCdcbicuam9pbihtYXAoJycuam9pbixiKSkpCgpkZWYgdG9fYm9hcmQocyk6CglyZXR1cm4gW1sqaV1mb3IgaSBpbiBmaWx0ZXIoTm9uZSwgcy5zcGxpdCgnXG4nKSldCgpkZWYgRihzKToKIGI9dG9fYm9hcmQocykKIFBSKGIsZihiKSkKIHByaW50KCctJyoyMCkKCkYoczEpCkYoczIpCkYoczMpCkYoczQpCkYoczUp