нахождение кратчайшего пути в лабиринте (помогите плз нужно написать до понедельника)
Помогите плз, две задачи, преподы убьют если я их не напишу....
На прямоугольном поле, состоящем из клеток, находится робот. Про каждую клетку поля известно занята она или свободна. Робот может перемещаться только по свободным клеткам(и не по диагоналям). Нужно определить може т ли робот пройти от начального положения до конечного. Если он может, то нужно вывести кратчайший маршрут. - описание входа
на первой строке числа N и M - число строк и столбцев, соответственно.
на второй-начальные координаты робота.
на третьей - конечные координаты.
далее на N строках по M чисел, каждое из которых равно 0 или 1 (0-клетка свободна, 1 - нет)
] - описание выхода
в первой строке вывести количество робота на минимальном пути.
во второй - цифры разделенные пробелами, характеризующую траекторию.(1-шаг вправо, 2-шаг вниз,3-шаг влево, 4-шаг вверх)
если прохождение лабиринта невозможно, вывести -1
я это частично написал, т.е получил порядок позиций во время прохождения но не могу переделать их в направления шагов 
т.е в (1, 2....4)
Код:
program Projectc;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
max = 100;
nm = 10000;
type
point = record
x, y: Integer;
end;
tlist = record
count: Integer;
v: array [0..max] of point;
end;
plist = ^tlist;
var
m,n: Integer;
f: array[0..max+1,0..max+1] of Integer;
ta,tb: tlist;
a,b: plist;
bx,by, ex,ey: Integer;
i,j: Integer;
k: Integer;
found: Boolean;
poses:array[-1..nm,1..2] of Integer;
procedure add(x,y: Integer);
begin
with b^ do
begin
f[x,y] := k;
v[count].x := x;
v[count].y := y;
inc(Count);
end;
end;
procedure swap;
var t: plist;
begin
t := a;
a := b;
b := t;
b^.count := 0;
end;
begin
//assign(input, 'input.txt');
//reset(input);
//assign(output, 'output.txt');
//rewrite(output);
read(n,m,bx,by,ex,ey);
for i := 1 to n do
begin
for j := 1 to m do
begin
read(f[i,j]);
if f[i,j] = 0 then f[i,j] := nm
else f[i,j] := -1;
end;
readln;
end;
if (f[bx, by] < 0) or (f[ex, ey] < 0) then
begin
writeln('NO SOLUTION');
exit;
end;
for i := 0 to n do
begin
f[i,0] := -1;
f[i,m+1] := -1;
end;
for j := 0 to m do
begin
f[0,j] := -1;
f[n+1,j] := -1;
end;
found := false;
a := @ta;
b := @tb;
a^.count := 0;
b^.count := 0;
f[ex,ey] := 0;
add(ex,ey);
swap;
k := 1;
repeat
with a^ do
for i := 0 to Count-1 do
with v[i] do
begin
if (x = bx) and (y = by) then
begin
found := true;
break;
end;
if f[x+1,y] > k then add(x+1,y);
if f[x-1,y] > k then add(x-1,y);
if f[x,y+1] > k then add(x,y+1);
if f[x,y-1] > k then add(x,y-1);
end;
swap;
inc(k);
if k >= (n*m) then break;
until found;
dec(k,2);
if found then
begin
writeln(k);
for i := k-1 downto 0 do
if f[bx+1,by] = i then
begin
inc(bx);
writeln(bx, ' ', by);
poses[i,1]:=bx;
poses[i,2]:=by;
end else
if f[bx-1,by] = i then
begin
dec(bx);
writeln(bx, ' ', by);
poses[i,1]:=bx;
poses[i,2]:=by;
end else
if f[bx,by+1] = i then
begin
inc(by);
writeln(bx, ' ', by);
poses[i,1]:=bx;
poses[i,2]:=by;
end else
begin
dec(by);
writeln(bx, ' ', by);
poses[i,1]:=bx;
poses[i,2]:=by;
end;
{ Writeln;
poses[-1,1]:=ex;
poses[-1,2]:=ey;
for i:=k downto 0 do begin
write(poses[i,1],' ');Writeln(poses[i,2]);
end;
writeln;
poses[k+1,1]:=bx;
poses[k+1,2]:=by;
for i:=k downto 0 do begin
if poses[i,1]=poses[i-1,1]+1 then write(i,1,' ')else
if poses[i,2]=poses[i-1,2]+1 then write(i,3,' ')else
if poses[i,2]=poses[i-1,2]-1 then write(i,4,' ')else
if poses[i,1]=poses[i-1,1]-1 then write(i,2,' ');
end; }
end
else writeln(-1);
readln;
Readln;
end.
|