Просмотр содержимого документа
«Условие и решение задачи « Огромная парковка».»



Решение задачи « Огромная парковка»
const
sx:array[1..4] of longint = (1, 0, -1, 0);
sy:array[1..4] of longint = (0, 1, 0, -1);
maxn = 55;
maxq = 1000000;
var
a:array[0..maxn, 0..maxn] of char;
d:array[0..maxn, 0..maxn, 0..maxn, 0..maxn] of longint;
x,y,xx,yy:array[0..maxq] of longint;
nx,ny,nxx,nyy,pd,pxx,pyy,px,py,stx,sty,enx,eny,q1,q2,n,m,i,j,k:longint;
procedure add(const cx, cy, cxx, cyy, cd:longint);
begin
if (cx = 0)or(cy = 0)or(cxn)or(cym)or
(cxx = 0)or(cyy = 0)or(cxxn)or(cyym)or
(a[cx, cy] = '#')or
(a[cxx, cyy] = '#')or(d[cx, cy, cxx, cyy] if (cxx = 1)and(cyy = 1) then
begin
writeln(cd);
close(output);
halt;
end;
x[q1]:=cx;
y[q1]:=cy;
xx[q1]:=cxx;
yy[q1]:=cyy;
inc(q1);
d[cx, cy, cxx, cyy]:=cd;
end;
begin
assign(input, 'parking.in');
reset(input);
assign(output, 'parking.out');
rewrite(output);
readln(n, m);
for i:=1 to n do
begin
for j:=1 to m do read(a[i, j]);
readln;
end;
for i:=1 to n do for j:=1 to m do if a[i, j] = 'X' then
begin
stx:=i;
sty:=j;
end else if a[i, j] = '.' then
begin
enx:=i;
eny:=j;
end;
fillchar(d, sizeof(d), 63);
add(enx, eny, stx, sty, 0);
while q1q2 do
begin
px:=x[q2];
py:=y[q2];
pxx:=xx[q2];
pyy:=yy[q2];
pd:=d[px, py, pxx, pyy];
for k:=1 to 4 do
begin
nx:=px+sx[k];
ny:=py+sy[k];
nxx:=pxx;
nyy:=pyy;
if (nxx = nx)and(nyy = ny) then
begin
nx:=pxx;
ny:=pyy;
nxx:=px;
nyy:=py;
end;
add(nx, ny, nxx, nyy, pd+1);
end;
inc(q2);
end;
writeln('Impossible');
close(output);
end.