Здравствуйте нужна помощ соответственно суть программы уже описывалась у вас на ++ (на шахматной доске найти кратчайший путь конем между двумя заданными клетками) ссылка на тему вот
проблема в том что мне нужно написать это на делфи ... оформление я сделать могу в принципе и уже сделал но вот алгоритм не знаю как исправить и как сум путь показать вот примерный мой черновой код... очень прошу помочь с алгоритмом ((
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
grid1: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure true(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Path = 'C:\Users\asus\Desktop\1.bmp';
cx:array[1..8] of -2..2=(2, 1,-1,-2,-2,-1, 1, 2);
cy:array[1..8] of -2..2=(1, 2, 2, 1,-1,-2,-2,-1);
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.true(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
//красим ячейки
var
i,j,i1,j1:Integer;
begin
i1:=0;
j1:=0;
for j:=0 to 7 do
begin
j1:=j1+1;
if(j1 mod 2 = 0) then
begin
for i:=0 to 7 do
begin
i1:=i1+1;
if (i1 mod 2 = 0) then
begin
Rect:=grid1.CellRect(i,j);
with grid1.Canvas do
begin
Brush.Color:=clwhite;
FillRect(Rect);
end;
end
else
begin
Rect:=grid1.CellRect(i,j);
with grid1.Canvas do
begin
Brush.Color:=clblack;
FillRect(Rect);
end;
end;
end;
end
else
begin
for i:=0 to 7 do
begin
i1:=i1+1;
if (i1 mod 2 = 0) then
begin
Rect:=grid1.CellRect(i,j);
with grid1.Canvas do
begin
Brush.Color:=clblack;
FillRect(Rect);
end;
end
else
begin
Rect:=grid1.CellRect(i,j);
with grid1.Canvas do
begin
Brush.Color:=clwhite;
FillRect(Rect);
end;
end;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
BitMap:TBitMap;
Rect:TRect;
j,i:Integer;
begin
j:=strtoint(Edit1.text)-1;
i:=strtoint(Edit2.text)-1;
Rect:=grid1.CellRect(i,j);
BitMap:=TBitMap.Create;
(BitMap as TBitMap).LoadFromFile(Path);
grid1.Canvas.StretchDraw(Rect,(BitMap as TBitmap));
BitMap.Free;
button1.Enabled:=False;
grid1.Canvas.FrameRect(rect);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
BitMap:TBitMap;
Rect:TRect;
a,b:Integer;
begin
b:=strtoint(Edit3.text)-1;
a:=strtoint(Edit4.text)-1;
Rect:=grid1.CellRect(a,b);
BitMap:=TBitMap.Create;
(BitMap as TBitMap).LoadFromFile(Path);
grid1.Canvas.StretchDraw(Rect,(BitMap as TBitmap));
BitMap.Free;
button2.Enabled:=False;
grid1.Canvas.FrameRect(rect);
end;
{процедура закрашивания одной ячейки}
procedure DrawCell(var grid:TStringGrid; i1,j1: integer);
var
Rect:TRect;
begin
Rect:=grid.CellRect(i1,j1);
with grid.Canvas do
begin
Brush.Color:=$0080FF;
FillRect(Rect);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
type
mass=array[1..8,1..8] of integer;
Var
f:mass;
j,i:integer;
Procedure KON(var doska:mass;x,y,i:integer);
Var k,u,v,i2,j2,kol:integer;
procedure MIN;
var i1,j1:integer;
C:mass;
begin
if i<kol then begin
kol:=i;
for i1:=1 to 8 do
for j1:=1 to 8 do C[i1,j1]:=doska[i1,j1];
end;
end;
Begin
k:=0;
i2:=strtoint(Edit3.text)-1;
j2:=strtoint(Edit4.text)-1;
repeat
k:=k+1;
u:=x+cx[k];
v:=y+cy[k];
if (u>=1)and(u<=8)and(v>=1)and(v<=8)and(doska[u,v]=0) then
begin doska[u,v]:=i;
if (u=i2)and(v=j2) then
begin
min;
doska [u,v]:=0;
k:=8;
end
else
begin
if i<kol then
KON(doska,u,v,i+1);
end;
end;
DrawCell(grid1,u,v);
until k=8;
end;
begin
j:=strtoint(Edit1.text)-1;
i:=strtoint(Edit2.text)-1;
KON(f,j,i,1);
end;
end.