|
#1
|
|||
|
|||
Волновой алгоритм
Реализовать данное задание на делфи.
Сам пытался сделать,но не допераю,что не так.Можете попробовать сделать массив направлений(type Direction=(drRight,drLeft,drUpRight,...) или же сделать 2 массива для координат x,y Дальше мой недокод,может кому-нибудь поможет Прошу помочь,если кто-то откликнется. UPD:в коде у меня закрашенные (непроходимые клетки) равны числу 50 Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids,Math; type TDirection=(drLeft,drRight,drUp,drDown,drRightUp,drRightDown,drLeftUp,drLeftDown); {TDirs=record drLeft,drRight,drUp,drDown,drRightUp,drRightDown,drLeftUp,drLeftDown:(i,j); end; } TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); const lock=50; x1=2; y1=3; x2=7; y2=1; type ArrDir=array of TDirection; Matrix=array [1..100,1..100] {of array} of integer; ArrCord=array [1..100] of integer; var p, A:Matrix; ii,jj,n, x,y,d, k,i,j,Rand1,Rand2:integer; begin n:=StrToInt(Edit1.Text); StringGrid1.ColCount:=n+1; StringGrid1.RowCount:=n+1; for i:=1 to n do begin StringGrid1.Cells[i,0]:=IntToStr(i); StringGrid1.Cells[0,i]:=IntToStr(i); end; for i:=1 to n do for j:=1 to n do StringGrid1.Cells[i,j]:='0'; for k:=1 to 3 do begin Rand1:=RandomRange(0,n); //определяю рандомные запрещенные клетки Rand2:=RandomRange(0,n); // StringGrid1.Cells[i,j]:='50'; // A[Rand1,Rand2]:=50; StringGrid1.Cells[Rand1,Rand2]:='50'; end; { SetLength(A,n,n); SetLength(p,n,n); } for i:=1 to n do for j:=1 to n do A[i,j]:=StrToInt(StringGrid1.Cells[i,j]); A[x1,y1]:=d; //помечаю стартовую ячейку { for ii:=Low(a) to High(A)-1 do for jj:=Low(a) to High(A)-1 do } for i:=1 to n do for j:=1 to n do begin if A[x1,y1]=0 then if A[x+1,y-1]=d then begin A[x+1,y-1]:=d+1; P[i,j]:=A[x+1,y-1]; end; if A[x-1,y+1]=d+1 then //тут ошибка begin A[x-1,y+1]:=d+1; P[i,j]:=A[x-1,y+1]; end; if A[x,y-1]=d+1 then begin A[x,y-1]:=d+1; P[i,j]:=A[x,y-1]; end; if A[x-1,y]=d+1 then begin A[x-1,y]:=d+1; P[i,j]:=A[x-1,y]; end; if A[x+1,y]=d+1 then begin A[x+1,y]:=d+1; P[i,j]:=A[x+1,y]; end; if A[x,y+1]=d then begin A[x,y+1]:=d+1; P[i,j]:=A[x,y+1]; end; if A[x+1,y+1]=d+1 then begin A[x+1,y+1]:=d+1; P[i,j]:=A[x+1,y+1]; end; if A[x-1,y-1]=d+1 then begin A[x-1,y-1]:=d+1; P[i,j]:=A[x-1,y-1]; end; { for i:=Low(a) to High(A) do for j:=Low(a) to High(A) do StringGrid1.Cells[i,j]:=IntToStr(A[i,j]); //промежуточный вывод } end; end; end. Последний раз редактировалось DayBreak, 05.05.2018 в 00:13. |
#2
|
|||
|
|||
читаем про алгоритм Дейкстры. Примеров на паскале в сети масса.
|
#3
|
|||
|
|||
Цитата:
|