program
TestLab;
uses
Windows, ShellAPI;
const
LabWidth =
100
;
LabHeight =
100
;
type
TLabirint =
array
[
1..
LabHeight,
1..
LabWidth]
of
Integer
;
var
Lab: TLabirint;
BI, BJ, EI, EJ:
Integer
;
Path:
string
;
function
IntToStr (A:
Integer
):
string
;
begin
Str (A, Result);
end
;
function
GetWay:
string
;
const
MinInit = -(LabWidth * LabHeight);
var
I, J, N:
Integer
;
Min:
Integer
;
Res:
string
;
procedure
FindPath (I, J, Len:
Integer
);
var
DI, DJ:
Integer
;
begin
Dec (Len);
if
(Len -
Abs
(EI - I) -
Abs
(EJ - J) > Min)
and
(Lab[I,J] <>
1
)
and
((Lab[I,J] < Len)
or
(Lab[I,J] =
0
))
then
begin
Lab[I,J] := Len;
if
(I <> EI)
or
(J <> EJ)
then
begin
DI := -
1
;
DJ := -
1
;
if
J < EJ
then
DJ :=
1
;
if
I < EI
then
DI :=
1
;
if
I = EI
then
begin
FindPath (I, J + DJ, Len);
FindPath (I + DI, J, Len);
FindPath (I, J - DJ, Len);
FindPath (I - DI, J, Len);
end
else
begin
FindPath (I + DI, J, Len);
FindPath (I, J + DJ, Len);
FindPath (I - DI, J, Len);
FindPath (I, J - DJ, Len);
end
;
end
else
Min := Len;
end
;
end
;
begin
Min := MinInit;
FindPath (BI, BJ,
0
);
Res :=
''
;
I := EI;
J := EJ;
N := Lab[I,J];
if
N <>
0
then
begin
while
(I <> BI)
or
(J <> BJ)
do
begin
Inc (N);
if
Lab[I-
1
,J] = N
then
begin
Res := Concat (
'D'
, Res);
Dec (I);
end
else
if
Lab[I+
1
,J] = N
then
begin
Res := Concat (
'U'
, Res);
Inc (I);
end
else
if
Lab[I,J-
1
] = N
then
begin
Res := Concat (
'R'
, Res);
Dec (J);
end
else
if
Lab[I,J+
1
] = N
then
begin
Res := Concat (
'L'
, Res);
Inc (J);
end
;
end
;
end
;
Result := Res;
end
;
procedure
PrintLab;
var
I, J, P:
Integer
;
Steps: TLabirint;
S, Row, WH, TDClass:
string
;
F: Text;
begin
for
I :=
1
to
LabHeight
do
for
J :=
1
to
LabWidth
do
Steps[I,J] :=
0
;
I := BI;
J := BJ;
for
P :=
1
to
Length (Path)
do
begin
case
Path[P]
of
'D'
: Inc (I);
'U'
: Dec (I);
'R'
: Inc (J);
'L'
: Dec (J);
end
;
Steps[I,J] :=
1
;
end
;
Assign (F,
'output.html'
);
Rewrite (F);
WriteLn
(F,
'<style type="text/css"><!--'
);
WriteLn
(F,
'table.labirint'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' border: 1px solid black;'
);
WriteLn
(F,
' background-color: white;'
);
WriteLn
(F,
' border-collapse: collapse;'
);
WriteLn
(F,
' padding: 0px;'
);
WriteLn
(F,
' font-size: 8pt;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'table.labirint td'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' border: 1px solid black;'
);
WriteLn
(F,
' background-color: white;'
);
WriteLn
(F,
' text-align: center;'
);
WriteLn
(F,
' text-decoration: none;'
);
WriteLn
(F,
' font-weight: normal;'
);
WriteLn
(F,
' padding: 0px;'
);
WriteLn
(F,
' width: 12px;'
);
WriteLn
(F,
' height: 12px;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'table.labirint th'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' border: 1px solid black;'
);
WriteLn
(F,
' background-color: #BF5000;'
);
WriteLn
(F,
' text-align: center;'
);
WriteLn
(F,
' text-decoration: none;'
);
WriteLn
(F,
' font-weight: normal;'
);
WriteLn
(F,
' padding: 0px;'
);
WriteLn
(F,
' width: 12px;'
);
WriteLn
(F,
' height: 12px;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'table.labirint td.path'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' background-color: red;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'table.labirint td.step'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' background-color: #EDFFEA;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'table.labirint td.begin'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' background-color: green;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'table.labirint td.end'
);
WriteLn
(F,
'{'
);
WriteLn
(F,
' background-color: lightblue;'
);
WriteLn
(F,
'}'
);
WriteLn
(F,
'--></style>'
);
WH :=
''
;
S :=
''
;
for
I :=
1
to
LabHeight
do
begin
Row :=
''
;
for
J :=
1
to
LabWidth
do
begin
TDClass :=
''
;
if
Lab[I,J] <
0
then
TDClass :=
' class="step"'
;
if
Steps[I,J] =
1
then
TDClass :=
' class="path"'
;
if
(I = BI)
and
(J = BJ)
then
TDClass :=
' class="begin"'
;
if
(I = EI)
and
(J = EJ)
then
TDClass :=
' class="end"'
;
if
Lab[I,J] <
0
then
Row := Concat (Row,
'<td'
, WH, TDClass,
'>'
, IntToStr (-Lab[I,J] -
1
),
'</td>'
);
if
Lab[I,J] =
0
then
Row := Concat (Row,
'<td'
, WH, TDClass,
'></td>'
);
if
Lab[I,J] =
1
then
Row := Concat (Row,
'<th'
, WH,
'></th>'
);
end
;
S := Concat (S,
'<tr>'
, Row,
'</tr>'
#
10
);
WH :=
''
;
end
;
S := Concat (
'<table class="labirint">'
#
10
, S,
'</table>'
#
10
);
WriteLn
(F, S);
Close (F);
ShellExecute (
0
,
'open'
,
'output.html'
,
nil
,
nil
, SW_SHOW);
end
;
procedure
RandomLab;
var
I, J, N, D:
Integer
;
begin
for
I :=
1
to
LabHeight
do
begin
Lab[I,
1
] :=
1
;
Lab[I,LabWidth] :=
1
;
end
;
for
J :=
1
to
LabWidth
do
begin
Lab[
1
,J] :=
1
;
Lab[LabHeight,J] :=
1
;
end
;
D := Random (
3
) +
2
;
for
N :=
1
to
LabWidth * LabHeight
div
D
do
Lab[Random(LabHeight)+
1
,Random(LabWidth)+
1
] :=
1
;
repeat
BI := Random (LabHeight) +
1
;
BJ := Random (LabWidth) +
1
;
until
Lab[BI,BJ] =
0
;
repeat
EI := Random (LabHeight) +
1
;
EJ := Random (LabWidth) +
1
;
until
Lab[EI,EJ] =
0
;
end
;
begin
Randomize;
RandomLab;
Path := GetWay;
PrintLab;
end
.