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))
if F:
x,y,o=T[0]
for t in combinations([(X,Y)for X,Y in o if3<Y+2<len(U[0])and I==c[(X,Y)]or3<X+2<len(U)and N==c[(X,Y)]],M[(x,y)]-sum(P==c[O]for O in o)):q+={**c,**{i:P for i in t}},