Условие:
Дана матрица 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;
решено с помощью алгоритма ___Очередь___