program poj3076; const maxs=16*3*16+256; g:array[1..16,1..16] of longint= ((1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), (1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), (1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), (1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), (5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8), (5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8), (5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8), (5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8), (9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12), (9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12), (9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12), (9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12), (13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16), (13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16), (13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16), (13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16)); wr:array[1..4] of longint=(2,3,4,1); wl:array[1..4] of longint=(4,1,2,3); type aaa=^jd; jd=record u,d,l,r:aaa; x,y,z,hh:longint; end; var s:array[0..maxs] of ^jd; f:array[0..maxs] of longint; z:array[1..16,1..16] of longint; data:array[1..16] of string[16]; i,j,k,jdjd,t:longint; find:boolean; {--------------} procedure init; var ll,rr:longint; begin fillchar(f,sizeof(f),0); find:=false; f[0]:=maxs+1; for i:=1 to 16 do for j:=1 to 16 do z[i,j]:=(i-1)*16+j; for i:=0 to maxs do new(s[i]); for i:=0 to maxs do with s[i]^ do begin if i-1>=0 then ll:=i-1 else ll:=maxs; if i+1<=maxs then rr:=i+1 else rr:=0; l:=s[ll]; r:=s[rr]; x:=0;y:=0;z:=0; u:=s[i]; d:=s[i]; hh:=i; end; end; {---------------------} procedure add(i,j,k:longint); var p:array[1..4] of aaa; dd:longint; begin for dd:=1 to 4 do begin new(p[dd]); with (p[dd]^) do begin x:=i;y:=j;z:=k; end; end; for dd:=1 to 4 do with p[dd]^ do begin r:=p[wr[dd]]; l:=p[wl[dd]]; end; p[1]^.u:=s[z[i,k]]; inc(f[z[i,k]]); p[1]^.d:=s[z[i,k]]^.d; p[1]^.u^.d:=p[1]; p[1]^.d^.u:=p[1]; p[1]^.hh:=p[1]^.u^.hh; p[2]^.u:=s[z[j,k]+256]; inc(f[z[j,k]+256]); p[2]^.d:=s[z[j,k]+256]^.d; p[2]^.u^.d:=p[2]; p[2]^.d^.u:=p[2]; p[2]^.hh:=p[2]^.u^.hh; p[3]^.u:=s[z[g[i,j],k]+512]; inc(f[z[g[i,j],k]+512]); p[3]^.d:=s[z[g[i,j],k]+512]^.d; p[3]^.u^.d:=p[3]; p[3]^.d^.u:=p[3]; p[3]^.hh:=p[3]^.u^.hh; p[4]^.u:=s[z[i,j]+768]; inc(f[z[i,j]+768]); p[4]^.d:=s[z[i,j]+768]^.d; p[4]^.u^.d:=p[4]; p[4]^.d^.u:=p[4]; p[4]^.hh:=p[4]^.u^.hh; end; {-------------------} procedure cover(p:aaa); var q:aaa; begin p^.r^.l:=p^.l; p^.l^.r:=p^.r; p:=p^.d; while p<>s[p^.hh] do begin q:=p^.r; while q<>p do begin q^.d^.u:=q^.u; q^.u^.d:=q^.d; dec(f[q^.hh]); q:=q^.r; end; p:=p^.d; end; end; {---------------} procedure recover(p:aaa); var q:aaa; begin p^.r^.l:=p; p^.l^.r:=p; p:=p^.u; while p<>s[p^.hh] do begin q:=p^.l; while q<>p do begin q^.d^.u:=q; q^.u^.d:=q; inc(f[q^.hh]); q:=q^.l; end; p:=p^.u; end; end; {------------------} procedure answer; var i,j:longint; begin for i:=1 to 16 do begin for j:=1 to 16 do write(data[i,j]); writeln; end; writeln; end; {------------------} procedure DLX; var p,x,q:^jd; min:longint; begin p:=s[0];min:=maxs; if s[0]^.l=s[0] then begin answer; find:=true; exit; end; repeat with p^ do if f[hh]<min then begin min:=f[hh]; q:=p; end; p:=p^.l; until p=s[0]; if min=0 then exit; cover(q); p:=q^.d; while p<>q do begin with p^ do data[x,y]:=chr(z+64); inc(t); x:=p^.r; while x<>p do begin cover(s[x^.hh]); x:=x^.r; end; DLX; if find then exit; x:=p^.l; while x<>p do begin recover(s[x^.hh]); x:=x^.l; end; with p^ do data[x,y]:='-'; dec(t); p:=p^.d; end; recover(q); end; {---------------------} begin while not eof do begin init; for i:=1 to 16 do begin read(data[i]); if data[i]='' then exit; for j:=1 to 16 do begin if data[i,j]='-' then for k:=1 to 16 do add(i,j,k) else add(i,j,ord(data[i,j])-64); end; readln; end; readln; DLX; end; end.