unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Edit1: TEdit; btn_3: TButton; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; btn_1: TButton; pnl1: TPanel; pnl2: TPanel; pnl3: TPanel; procedure btn_3Click(Sender: TObject); procedure btn_1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private x,y,k,x1,y1,x2,y2 : integer; A : array [1..4, 1..4] of Integer; B : array [1..4, 1..4] of Integer; C : array [1..4, 1..4] of Integer; E : array [1..16] of TEdit; F : array [1..4, 1..4] of Boolean; function Walk(nx,ny,ni,nj:Integer; xNy:Boolean; WalkStr:string):string; function FangX(nx,ny,ni:integer):integer; { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.FangX(nx,ny,ni:integer):integer; begin if ni = 1 then // 右 if (A[nx,ny+1]=0) or (A[nx,ny+1]=A[x2,y2]) then Result:= 0 else Result:= 1 else if ni = 2 then // 下 if (A[nx+1,ny]=0) or (A[nx+1,ny]=A[x2,y2]) then Result:= 0 else Result:= 1 else if ni = 3 then // 左 if (A[nx,ny-1]=0) or (A[nx,ny-1]=A[x2,y2]) then Result:= 0 else Result:= 1 else if ni = 4 then // 上 if (A[nx-1,ny]=0) or (A[nx-1,ny]=A[x2,y2]) then Result:= 0 else Result:= 1 else Result:= 0; end;
//传入------- 1, 1, 1, 3, true 'Begin->11' function TForm1.Walk(nx,ny,ni,nj: Integer; xNy:Boolean; WalkStr:string):string; //var i: integer; begin //判断是否到了出口 if ((WalkStr='11')and(C[x1,y1]=5))or(F[1,1]=False) then begin WalkStr:=''; Showmessage('不通!'); exit; end else if (WalkStr<>(IntToStr(x2)+IntToStr(y2))) then begin if (FangX(nx,ny,1)=0) and(C[nx,ny+1]<>5) and(C[nx,ny+1]=0) and(ny<y) then begin B[nx,ny]:=nj; C[nx,ny]:=1; F[nx,ny]:=True; Result:=WalkStr+'->'+Walk(nx,ny+1,B[nx,ny],C[nx,ny],F[nx,ny],(IntToStr(nx)+IntToStr(ny+1))); end else if (FangX(nx,ny,2)=0) and(C[nx+1,ny]<>5) and(C[nx+1,ny]=0) and(nx<x) then begin B[nx,ny]:=nj; C[nx,ny]:=2; F[nx,ny]:=True; Result:=WalkStr+'->'+Walk(nx+1,ny,B[nx,ny],C[nx,ny],F[nx,ny],(IntToStr(nx+1)+IntToStr(ny))); end else if (FangX(nx,ny,3)=0) and(C[nx,ny-1]<>5) and(C[nx,ny-1]=0) and(ny>1) then begin B[nx,ny]:=nj; C[nx,ny]:=3; F[nx,ny]:=True; Result:=WalkStr+'->'+Walk(nx,ny-1,B[nx,ny],C[nx,ny],F[nx,ny],(IntToStr(nx)+IntToStr(ny-1))); end else if (FangX(nx,ny,4)=0) and(C[nx-1,ny]<>5) and(C[nx-1,ny]=0) and(nx>1) then begin B[nx,ny]:=nj; C[nx,ny]:=4; F[nx,ny]:=True; Result:=WalkStr+'->'+Walk(nx-1,ny,B[nx,ny],C[nx,ny],F[nx,ny],(IntToStr(nx-1)+IntToStr(ny))); end else begin C[nx,ny]:=5; B[nx,ny]:=5; F[nx,ny]:=False; Case nj of 3: begin Result:=WalkStr+'->'+Walk(nx,ny+1,nj,B[nx,ny+1],F[nx,ny+1],(IntToStr(nx)+IntToStr(ny+1))); end; 4: begin Result:=WalkStr+'->'+Walk(nx+1,ny,nj,B[nx+1,ny],F[nx+1,ny],(IntToStr(nx+1)+IntToStr(ny))); end; 1: begin Result:=WalkStr+'->'+Walk(nx,ny-1,nj,B[nx,ny-1],F[nx,ny-1],(IntToStr(nx)+IntToStr(ny-1))); end; 2: begin Result:=WalkStr+'->'+Walk(nx-1,ny,nj,B[nx-1,ny],F[nx-1,ny],(IntToStr(nx-1)+IntToStr(ny))); end; end; end; end else Result := inttostr(x)+inttostr(y)+'->End'; end;
procedure TForm1.btn_3Click(Sender: TObject); begin //数组中0表示通路1表示不通 x1:= 1; //strtoint(edit1.Text); y1:= 1; //strtoint(edit2.Text); //入口坐标 x2:= x; //strtoint(edit3.Text); y2:= y; //strtoint(edit4.Text); //出口坐标 //判断(行列、辅助、对焦线)是否有断裂情况加速程序运行 Edit5.Text := Walk(x1,y1,1,1,True,'Begin->11') ; if Edit5.Text = '' then Showmessage('不通!') end;
procedure TForm1.btn_1Click(Sender: TObject); var i,j : Integer ; begin Edit5.Text := ''; if (k<>1) then begin for i := 1 to k-1 do E[i].Free; end; k := 1; x := 4; y := 4; for i := 1 to x do for j := 1 to y do begin A[i, j] := Random(2); F[i, j] := True; B[i, j] := 0; C[i, j] := 0; begin E[k] := TEdit.Create(Self); E[k].Parent:= pnl2; E[k].Height:= 20; E[k].Width := 20; E[k].Top := i*28-20; E[k].Left := j*28-20; E[k].Name := 'k' + IntToStr(k); E[k].Text := IntToStr(A[i,j]); k:=k+1; end; Edit5.Text := Edit5.Text + IntToStr(A[i,j]); end; A[1, 1] := 0; A[x, y] := 0; E[1].Text :='0'; E[k-1].Text :='0'; end;
procedure TForm1.FormCreate(Sender: TObject); begin k:=1; end;
end.