Волновой алгоритм
Реализовать данное задание на делфи.
Сам пытался сделать,но не допераю,что не так.Можете попробовать сделать массив направлений(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.
|