V=[L:='+',*L.join(N*len(b[0])),L];U=[k for i in b for k in[V,[I,*I.join(P*len(i)),I]]]+[V];q=[S:={(x,y):v for x,r in E(U)for y,v in E(r)if v in Z}];M=dict(zip([i for i in q[0]if P==q[0][i]],[j for k in b for j in k]))
for c in q:
T,F=[],1
for x,y,o in[(x,y,[X for X in[(x+1,y),(x-1,y),(x,y-1),(x,y+1)]])for x,y in c if P==S[(x,y)]]:z=M[(x,y)];T+=(z>(H:=sum(P==c[O]for O in o)))*[(x,y,o)];F*=z>=H
if[]==T:
for X,Y in c:U[X][Y]=c[(X,Y)]
return'\n'.join(map(''.join,U))
x,y,o=T[0]
for t in combinations([X for X in o if(I!=c[X])<1<X[1]<len(U[0])-2or(N!=c[X])<1<X[0]<len(U)-2],M[(x,y)]-sum(P==c[O]for O in o)):q+=F*[{**c,**{i:P for i in t}}]