Listing Careu.PAS 
{R-,I-,C-,S-} 
Program Rebus; 
uses Crt; 
Type rebus=array[1..10,1..10] of char; 
Var fin,fout:Text; 
i,j,k,n,m,p,pos:Word; 
b:array[0..11,0..11] of char; 
d:array[0..200,1..5] of Byte; 
c:array[1..5000] of String[10]; 
a:rebus; f:Boolean; 
Procedure Afis(a:rebus); 
var i,j:Byte; 
begin 
for i:=1 to n do 
begin 
for j:=1 to n do Write(fout,a[i,j]); 
Writeln(fout) 
end 
end; 
Procedure back(k:Word;a:rebus); 
var i,j:Byte; b:rebus; f:Boolean; 
begin 
if k=m+1 
then 
begin afis(a); Close(fout); Halt end 
else 
begin 
for i:=1 to pos do 
if (d[i,5]=0) and 
(d[i,3]=Length(c[k])) 
then 
begin 
if d[i,4]=1 
then 
begin 
f:=true; j:=0; 
while (j<d[i,3]) do 
begin 
if (a[d[i,1],d[i,2]+j]<>' ') 
and (a[d[i,1],d[i,2]+j]<> c[k,j+1]) 
then 
begin f:=false; j:=d[i,3] end 
else j:=j+1 
end; 
if f 
then 
begin 
b:=a; 
for j:=1 to d[i,3] do 
b[d[i,1],d[i,2]+j-1]:=c[k,j]; 
d[i,5]:=1; 
back(k+1,b); 
d[i,5]:=0 
end 
end; 
if d[i,4]=2 
then 
begin 
f:=true; 
j:=0; 
while (j<d[i,3]) do 
begin 
if (a[d[i,1]+j,d[i,2]]<>' ') 
and (a[d[i,1]+j,d[i,2]]<> 
c[k,j+1]) 
then 
begin f:=false; j:=d[i,3] end 
else j:=j+1 
end; 
if f 
then 
begin 
b:=a; 
for j:=1 to d[i,3] do 
b[d[i,1]+j-1,d[i,2]]:=c[k,j]; 
d[i,5]:=1; 
back(k+1,b); 
d[i,5]:=0 
end 
end 
end 
end 
end; 
Begin 
Assign(fin,'careu.in'); Reset(fin); 
Assign(fout,'careu.out'); ReWrite(fout); 
Readln(fin,n,p); 
fillchar(b,sizeof(b),'-'); 
fillchar(a,sizeof(a),' '); 
for i:=1 to p do 
begin 
Read(fin,k,j); 
b[k,j]:='@'; 
a[k,j]:='@' 
end; 
for i:=0 to n+1 do 
begin 
b[0,i]:='@'; b[n+1,i]:='@'; 
b[i,0]:='@'; b[i,n+1]:='@' 
end; 
pos:=0; 
for i:=1 to n do 
for j:=1 to n do 
begin 
if b[i,j]='@' 
then begin end 
else 
begin 
if b[i,j-1]='@' 
then 
begin 
k:=1; 
while b[i,j+k]='-' do Inc(k); 
pos:=pos+1; 
d[pos,1]:=i; d[pos,2]:=j; 
d[pos,3]:=k;d[pos,4]:=1;d[pos,5]:=0 
end; 
if b[i-1,j]='@' 
then 
begin 
k:=1; 
while b[i+k,j]='-' do Inc(k); 
Inc(pos); 
d[pos,1]:=i; d[pos,2]:=j; 
d[pos,3]:=k; d[pos,4]:=2; d[pos,5]:=0 
end 
end 
end; 
m:=0; 
while not SeekEof(fin) do 
begin Inc(m); Readln(fin,c[m]) end; 
for i:=1 to pos-1 do 
begin 
k:=i; 
for j:=i+1 to pos do 
if d[k,3]<d[j,3] then k:=j; 
d[0]:=d[k]; d[k]:=d[i]; d[i]:=d[0] 
end; 
back(1,a) 
End.