Условие:

Дана матрица n*m клеток состоящая из 0(клеточка где можно пройти) и -1(там где нельзя пройти).

Найти кратчайший маршрут от точки А до точки В. (обе точки вводятся)
И вывести сам путь.

Пример

Ввод:                              
5 5                                                 
1 1                                                 
1 5                                                   
0  -1  0  0  0                                                                     
0  0  -1  0 -1                                                       
0  0   0  0  0                                                   
-1 0   0 -1  0                                           
0  -1  0  0  0                                     

Вывод:

1  -1  0  8  9                                                     
2  0  -1  7 -1                                                       
3  4   5  6  0                                                   
-1 0   0 -1  0                                           
0  -1  0  0  0     

Решение

1) Первым действием у нас процедура сосед которая смотрит если рядом стоящая клеточка  пустая то забивает  туда следующий номер пути.

2) Вторым действием мы читаем элементы создаём рамочки из -1 что бы не выйти за край и создаём очередь.

3) Третьим действием мы запускаем ваил в котором мы ищём возможные пути и помечаем их

4) Четвёртым действием(оно работает если только мы нашли путь)  находим путь которым шли идя с конца мы смотри какое число идёт по убыванию за нами

5) Ну и вывод массива если вам надо вывести только элементы идти нужно с конца  :)

Код:
var p:array[0..101,0..101] of integer;
q:array[1..2,1..1000] of integer;
nm,i,j,n,m,i1,j1,fi,fj,ci,cj,un,uk,f:integer;

{-------------------------Часть №1-------------------------}

procedure  sosed(x,y:integer);
begin
if p[x,y]=0 then begin
                 q[1,uk]:=x;
                 q[2,uk]:=y;
                 uk:=uk+1;
                 p[x,y]:=p[i1,j1]+ 1;
                 end;
end;


{-------------------------Часть №2-------------------------}

begin
readln(n,m);
for i:=1 to n do
 for j:=1 to m do read(p[i,j]);

 for i:=0 to m+1 do begin
                     p[i,0]:=-1;
                     p[i,m+1]:=-1;
                     end;
for j:=1 to m do begin
                     p[0,j]:=-1;
                     p[n+1,j]:=-1;
                             end;
 readln(ci,cj);
 readln(fi,fj);
 uk:=1;
 un:=1;
p[ci,cj]:=1;
q[1,uk]:=ci;
q[2,uk]:=cj;
 uk:=uk+1;

 {-------------------------Часть №3-------------------------}
 while (un<>uk)and(p[fi,fj]=0) do begin
 i1:=q[1,un]; j1:=q[2,un];
 un:=un+1;
 sosed(i1+1,j1);
 sosed(i1-1,j1);
 sosed(i1,j1+1);
 sosed(i1,j1-1);
 end;
 if p[fi,fj]=0  then begin  writeln('NO'); exit; end
                else writeln( p[fi,fj]);


{-------------------------Часть №4-------------------------}

 i:=0;
  i1:=fi;
  j1:=fj;
  nm:=p[fi,fj];  
 while i<p[fi,fj] do begin
  
  i:=i+1;
  q[1,i]:=i1;
  q[2,i]:=j1;
  f:=0;
  nm:=nm-1;
  
  if (f=0)and(p[i1+1,j1]= nm ) then begin f:=1; i1:=i1+1; end;
 
  if (f=0)and(p[i1-1,j1]= nm ) then begin f:=1; i1:=i1-1; end;
  
  if (f=0)and(p[i1,j1+1]= nm ) then begin f:=1; j1:=j1+1; end;
   
  if (f=0)and(p[i1,j1-1]= nm ) then begin f:=1; j1:=j1-1; end;

 
 end;
 



 {-------------------------Часть №5-------------------------}

  nm:=p[fi,fj];
  
  {for j:=p[fi,fj]  downto 1  do writeln(q[1,j],' ',q[2,j]);}
  
for i:=1 to n do  
  for j:=1 to m do
  if p[i,j]<>-1 then p[i,j]:=0;
 
for j:=1  to nm  do p[ q[1,j],q[2,j] ]:=nm-j+1; 
  
  
 for i:=1 to n do  begin
  for j:=1 to m do
  write(p[i,j]:3);
  writeln;
  end;

решено с помощью алгоритма ___Очередь___