Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2010, 20:38
razh2009 razh2009 вне форума
Прохожий
 
Регистрация: 04.12.2010
Сообщения: 20
Репутация: 10
Печаль нахождение кратчайшего пути в лабиринте (помогите плз нужно написать до понедельника)

Помогите плз, две задачи, преподы убьют если я их не напишу....
На прямоугольном поле, состоящем из клеток, находится робот. Про каждую клетку поля известно занята она или свободна. Робот может перемещаться только по свободным клеткам(и не по диагоналям). Нужно определить може т ли робот пройти от начального положения до конечного. Если он может, то нужно вывести кратчайший маршрут.
  • описание входа
    на первой строке числа 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.

Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025