Поиск пути в числовом лабиринте

Нужно написать прогу, которая рисует путь от выбранной точки до выбранной точки в stringrid. Принцип перехода такой:параллельно осям Ох и Оу только в соседний квадрат с меньшим числом. Вот что наработал:
3 ответа

Немного переделал, пишет ошибку Stack Overflow(
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    strngrd1: TStringGrid;
    lbl1: TLabel;
    cbb1: TComboBox;
    Button1: TButton;
    procedure cbb1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure strngrd1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure Addcbb1 (K:Integer);
  procedure search(x,y: Integer);
 
var
  Form1: TForm1;
  i,j: Integer;
  n:Integer;
  XS,YS, XF,YF: Integer;
  x,y: integer ;
implementation
 
{$R *.dfm}
 
procedure Addcbb1 (K:Integer);
 
begin
  Randomize;
  form1.Strngrd1.ColCount:=form1.Strngrd1.ColCount+k;
  form1.Strngrd1.RowCount:=form1.Strngrd1.RowCount+k;
  form1.strngrd1.Width:= form1.strngrd1.Width+25*k;
  form1.strngrd1.Height:= form1.strngrd1.Height+25*k;
  for i:=0 to form1.strngrd1.ColCount do
  begin
    for j:=0 to form1.strngrd1.ColCount do
      Form1.strngrd1.Cells[i,j]:=IntToStr(10+Random(80));
  end;
end;
 
procedure TForm1.cbb1Change(Sender: TObject);
var
  k:Integer;
begin
  k:=0;
  case StrToInt(cbb1.Text) of
    5:begin
        Addcbb1(k);
      end;
    6:begin
        k:=1;
        Addcbb1(k);
      end;
    7:begin
        k:=2;
        Addcbb1(k);
      end;
    8:begin
        K:=3;
        Addcbb1(k);
      end;
    9:begin
        K:=4;
        Addcbb1(k);
      end;
    10:begin
        K:=5;
        Addcbb1(k);
      end;
  end;
  strngrd1.Visible:=True;
  cbb1.Enabled:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
var myRect: TGridRect;
begin
  with myRect do begin
    Left := -1;
    Top := -1;
    Right := -1;
    Bottom := -1;
  end;
  strngrd1.Selection := myRect;
end;
 
 
procedure TForm1.strngrd1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Sg : TStringGrid;
  Col, Row : Integer;
begin
  Sg := Sender as TStringGrid;
  Sg.MouseToCell(X, Y, Col, Row);
  if n=0 then
  begin
    YS:=Row;
    XS:=Col;
  end
  else begin
    YF:=Row;
    XF:=Col;
  end;
  if Button = mbLeft then
  begin
    Sg.Rows[Row].Objects[Col] := TObject(1);
  end;
  Inc(n);
end;
 
procedure TForm1.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
type
  TSave = record
    FontColor : TColor;
    FontStyle : TFontStyles;
    BrColor : TColor;
  end;
var
  Sg : TStringGrid;
  Save : TSave;
  Flag : Integer;
begin
  if  n<3 then
  begin
    Sg := Sender as TStringGrid;
    Flag := Integer(Sg.Rows[ARow].Objects[ACol]);
    //Åñëè ГґГ«Г*ГЈ Г*ГҐ Г°Г*ГўГҐГ* 1 - âûõîäèì.
    if Flag <> 1 then Exit;
    //Г‚ ïðîòèâГ*îì ñëó÷Г*ГҐ, èçìåГ*ГїГҐГ¬ öâåò ÿ÷åéêè.
    with Sg.Canvas, Save do begin
      //Г‡Г*ïîìèГ*Г*ГҐГ¬ ГЇГ*Г°Г*ìåòðû øðèôòГ* ГЁ ГЄГЁГ±ГІГЁ.
      FontColor := Font.Color;
      FontStyle := Font.Style;
      BrColor := Brush.Color;
 
      //ÓñòГ*Г*Г*âëèâГ*ГҐГ¬ Г*îâûå ГЇГ*ðìåòðû.
 
      //Г–ГўГҐГІ øðèôòГ* - áåëûé.
      Font.Color := RGB(255, 255, 255);
      //Ñòèëü øðèôòГ* - æèðГ*ûé.
      Font.Style := Font.Style + [fsBold];
 
        Brush.Color := RGB(14, 36, 250);
 
 
      //ÏðîðèñîâûâГ*ГҐГ¬ ÿ÷åéêó.
 
      //Г‡Г*ëèâГ*ГҐГ¬ ГЄГўГ*äðГ*ГІ ÿ÷åéêè öâåòîì ГЄГЁГ±ГІГЁ.
      FillRect(Rect);
      //ÏðîðèñîâûâГ*ГҐГ¬ Гў ÿ÷åéêå ГІГҐГЄГ±ГІ. Çäåñü +2 - ГІГ*ГЄ ìû Г§Г*Г¤Г*ВёГ¬ øèðèГ*Гі ïîëåé Гў ÿ÷åéêå.
      TextOut(Rect.Left + 2, Rect.Top + 2, Sg.Cells[ACol, ARow]);
 
      //ÂîññòГ*Г*Г*âëèâГ*ГҐГ¬ ïðåæГ*ГЁГҐ ГЇГ*Г°Г*ìåòðû ГЄГ*Г*ГўГ».
      Font.Color := FontColor;
      Font.Style := FontStyle;
      Brush.Color := BrColor;
      {if n=2 then
        strngrd1.Enabled:=False; }
    end;
  end;
end;
 
procedure search(x,y: Integer);
begin
  with Form1 do
  begin
    if StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x+1,y]) then
    begin
      strngrd1.Cells[x,y]:='99';
      search(x+1,y);
      search(x-1,y);
      search(x,y+1);
      search(x,y-1);
    end
    else if ((x=XF)and(y=YF)) then
      Exit;
    if StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x-1,y]) then
    begin
      strngrd1.Cells[x,y]:='99';
      search(x+1,y);
      search(x-1,y);
      search(x,y+1);
      search(x,y-1);
    end
     else if ((x=XF)and(y=YF)) then
      Exit;
    if StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x,y-1]) then
    begin
      strngrd1.Cells[x,y]:='99';
      search(x+1,y);
      search(x-1,y);
      search(x,y+1);
      search(x,y-1);
    end
     else if ((x=XF)and(y=YF)) then
      Exit;
    if StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x,y+1]) then
    begin
      strngrd1.Cells[x,y]:='99';
      search(x+1,y);
      search(x-1,y);
      search(x,y+1);
      search(x,y-1);
    end
     else if ((x=XF)and(y=YF)) then
      Exit;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  x:=XS;
  y:=YS;
  repeat
    search(x,y);
  until ((x=XF) and (y=YF))
end;
 
end.
Ошибка вылазит, потому что слишком много итераций, мне кажется, но вот не понятно почему, даже если какая то часть действий в процедуре выполняется, значения ячеек в stringgrid не меняется на 99. ОЧень нужна помощь


А у меня совсем другие ошибки выскочили. Либо совсем зависает..


А у меня совсем другие ошибки выскочили. Либо совсем зависает..
Да, иногда пишет что "" не является значением integer. Это потому что за границы вышел, но это дело поправимое, а вот сама работоспособность...Сделал что уже как-то ходит по массиву, вроде не циклится, но всё же ругается на '', и рисует "99" по пройденным клеткам:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    strngrd1: TStringGrid;
    lbl1: TLabel;
    cbb1: TComboBox;
    Button1: TButton;
    procedure cbb1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure strngrd1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure Addcbb1 (K:Integer);
  procedure search(x,y: Integer);
 
var
  Form1: TForm1;
  i,j: Integer;
  n:Integer;
  XS,YS, XF,YF: Integer;
  x,y: integer ;
implementation
 
{$R *.dfm}
 
procedure Addcbb1 (K:Integer);
 
begin
  Randomize;
  form1.Strngrd1.ColCount:=form1.Strngrd1.ColCount+k;
  form1.Strngrd1.RowCount:=form1.Strngrd1.RowCount+k;
  form1.strngrd1.Width:= form1.strngrd1.Width+25*k;
  form1.strngrd1.Height:= form1.strngrd1.Height+25*k;
  for i:=0 to form1.strngrd1.ColCount do
  begin
    for j:=0 to form1.strngrd1.ColCount do
      Form1.strngrd1.Cells[i,j]:=IntToStr(10+Random(80));
  end;
end;
 
procedure TForm1.cbb1Change(Sender: TObject);
var
  k:Integer;
begin
  k:=0;
  case StrToInt(cbb1.Text) of
    5:begin
        Addcbb1(k);
      end;
    6:begin
        k:=1;
        Addcbb1(k);
      end;
    7:begin
        k:=2;
        Addcbb1(k);
      end;
    8:begin
        K:=3;
        Addcbb1(k);
      end;
    9:begin
        K:=4;
        Addcbb1(k);
      end;
    10:begin
        K:=5;
        Addcbb1(k);
      end;
  end;
  strngrd1.Visible:=True;
  cbb1.Enabled:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
var myRect: TGridRect;
begin
  with myRect do begin
    Left := -1;
    Top := -1;
    Right := -1;
    Bottom := -1;
  end;
  strngrd1.Selection := myRect;
end;
 
 
procedure TForm1.strngrd1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Sg : TStringGrid;
  Col, Row : Integer;
begin
  Sg := Sender as TStringGrid;
  Sg.MouseToCell(X, Y, Col, Row);
  if n=0 then
  begin
    YS:=Row;
    XS:=Col;
  end
  else begin
    YF:=Row;
    XF:=Col;
  end;
  if Button = mbLeft then
  begin
    Sg.Rows[Row].Objects[Col] := TObject(1);
  end;
  Inc(n);
end;
 
procedure TForm1.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
type
  TSave = record
    FontColor : TColor;
    FontStyle : TFontStyles;
    BrColor : TColor;
  end;
var
  Sg : TStringGrid;
  Save : TSave;
  Flag : Integer;
begin
  if  n<3 then
  begin
    Sg := Sender as TStringGrid;
    Flag := Integer(Sg.Rows[ARow].Objects[ACol]);
    //Åñëè ГґГ«Г*ГЈ Г*ГҐ Г°Г*ГўГҐГ* 1 - âûõîäèì.
    if Flag <> 1 then Exit;
    //Г‚ ïðîòèâГ*îì ñëó÷Г*ГҐ, èçìåГ*ГїГҐГ¬ öâåò ÿ÷åéêè.
    with Sg.Canvas, Save do begin
      //Г‡Г*ïîìèГ*Г*ГҐГ¬ ГЇГ*Г°Г*ìåòðû øðèôòГ* ГЁ ГЄГЁГ±ГІГЁ.
      FontColor := Font.Color;
      FontStyle := Font.Style;
      BrColor := Brush.Color;
 
      //ÓñòГ*Г*Г*âëèâГ*ГҐГ¬ Г*îâûå ГЇГ*ðìåòðû.
 
      //Г–ГўГҐГІ øðèôòГ* - áåëûé.
      Font.Color := RGB(255, 255, 255);
      //Ñòèëü øðèôòГ* - æèðГ*ûé.
      Font.Style := Font.Style + [fsBold];
 
        Brush.Color := RGB(14, 36, 250);
 
 
      //ÏðîðèñîâûâГ*ГҐГ¬ ÿ÷åéêó.
 
      //Г‡Г*ëèâГ*ГҐГ¬ ГЄГўГ*äðГ*ГІ ÿ÷åéêè öâåòîì ГЄГЁГ±ГІГЁ.
      FillRect(Rect);
      //ÏðîðèñîâûâГ*ГҐГ¬ Гў ÿ÷åéêå ГІГҐГЄГ±ГІ. Çäåñü +2 - ГІГ*ГЄ ìû Г§Г*Г¤Г*ВёГ¬ øèðèГ*Гі ïîëåé Гў ÿ÷åéêå.
      TextOut(Rect.Left + 2, Rect.Top + 2, Sg.Cells[ACol, ARow]);
 
      //ÂîññòГ*Г*Г*âëèâГ*ГҐГ¬ ïðåæГ*ГЁГҐ ГЇГ*Г°Г*ìåòðû ГЄГ*Г*ГўГ».
      Font.Color := FontColor;
      Font.Style := FontStyle;
      Brush.Color := BrColor;
      {if n=2 then
        strngrd1.Enabled:=False; }
    end;
  end;
end;
 
procedure search(x,y: Integer);
begin
  begin
  with Form1 do
  begin
    if ((StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x+1,y])) and (x<>strngrd1.ColCount)) then
    begin
      if ((x=XF)and(y=YF)) then
        ShowMessage('Ïðèøëè!!!');
      strngrd1.Cells[x,y]:='99';
      search(x+1,y);
    end
    else if ((x=XF)and(y=YF)) then
      Exit;
    if (StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x-1,y]))and (x<>0) then
    begin
      if ((x=XF)and(y=YF)) then
        ShowMessage('Ïðèøëè!!!');
      strngrd1.Cells[x,y]:='99';
      search(x-1,y);
    end
     else if ((x=XF)and(y=YF)) then
      Exit;
    if (StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x,y-1])) and (y<>0) then
    begin
      if ((x=XF)and(y=YF)) then
        ShowMessage('Ïðèøëè!!!');
      strngrd1.Cells[x,y]:='99';
      search(x,y-1);
    end
     else if ((x=XF)and(y=YF)) then
      Exit;
    if (StrToInt(strngrd1.Cells[x,y])>StrToInt(strngrd1.Cells[x,y+1]))and (y<>strngrd1.RowCount) then
    begin
      if ((x=XF)and(y=YF)) then
        ShowMessage('Ïðèøëè!!!');
      strngrd1.Cells[x,y]:='99';
      search(x,y+1);
    end
     else if ((x=XF)and(y=YF)) then
      Exit;
  end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  x:=XS;
  y:=YS;
  search(x,y);
end;
 
end.