import sys input = sys.stdin.readline from collections import defaultdict,deque H,W=map(int,input().split()) MAP0=[input().strip() for i in range(H)] ALPHA="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" flag=0 LIST=[] for i in range(H): if MAP0[i].count("#")>0: LIST.append(i) if flag==0: if MAP0[i].count("#")>0: flag=1 else: if MAP0[i].count("#")==0: print("No") exit() if flag==0: for m in MAP0: print(m) exit() def calc(MAP): N=len(MAP) M=len(MAP[0]) start=N*M goal=N*M+1 # dinic法 V=N*M+2 EDGE=[defaultdict(int) for i in range(V)] for i in range(N): for j in range(M): if (i+j)%2==0 and MAP[i][j]=="#": u,v,c=start,i*M+j,1 EDGE[u][v]=c for x,y in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]: if 0<=x1 and to == i*M+j-1: MAP[i][j]=ALPHA[ind] MAP[i][j-1]=ALPHA[ind] ind+=1 elif EDGE[i*M+j][to]==1 and M>1 and to == i*M+j+1: MAP[i][j]=ALPHA[ind] MAP[i][j+1]=ALPHA[ind] ind+=1 elif EDGE[i*M+j][to]==1 and to == i*M+j-M: MAP[i][j]=ALPHA[ind] MAP[i-1][j]=ALPHA[ind] ind+=1 elif EDGE[i*M+j][to]==1 and to == i*M+j+M: MAP[i][j]=ALPHA[ind] MAP[i+1][j]=ALPHA[ind] ind+=1 return ANS,MAP for i in range(3**(len(LIST)+1)): MAP2=[] x=i for j in range(len(LIST)+1): k=x%3 for c in range(k): MAP2.append(["#"]*W) x//=3 if jH: continue count=0 for j in range(len(MAP2)): count+=MAP2[j].count("#") if count%2==1: continue #print(len(MAP2),MAP2) #print() xx,yy=calc(MAP2) #print("!!",xx,yy) if xx==count//2: print("Yes") if len(yy)