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.