Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 4 KB
PROGRAM Villamos;
CONST
inputFile = '';
maxn = 100;
TYPE
mezo = RECORD
tip, forg: BYTE;
tav: INTEGER;
kesz: BOOLEAN;
END;
leiras = RECORD
bal, jobb, fel, le: BOOLEAN;
END;
VAR
N, M: INTEGER;
map: ARRAY [0..maxn+1, 0..maxn+1] OF mezo;
s1, o1, s2, o2: BYTE;
kodok: ARRAY [0..4, 0..3, -1..1, -1..1] OF BOOLEAN;
PROCEDURE Init;
PROCEDURE Add(i: BYTE; f, j, l, b: BOOLEAN);
VAR
k: BYTE;
BEGIN
kodok[i, 0, -1, 0]:= f;
kodok[i, 0, 0, 1]:= j;
kodok[i, 0, 1, 0]:= l;
kodok[i, 0, 0, -1]:= b;
FOR k:= 1 TO 3 DO
BEGIN
kodok[i, k, -1, 0] := kodok[i, k-1, 0, -1];
kodok[i, k, 0, -1] := kodok[i, k-1, 1, 0];
kodok[i, k, 1, 0] := kodok[i, k-1, 0, 1];
kodok[i, k, 0, 1] := kodok[i, k-1, -1, 0];
END;
END;
VAR
i, j: INTEGER;
BEGIN
Add(0, FALSE, FALSE, FALSE, FALSE);
Add(1, TRUE, FALSE, FALSE, TRUE );
Add(2, FALSE, TRUE , FALSE, TRUE );
Add(3, TRUE , TRUE , FALSE, TRUE );
Add(4, TRUE , TRUE , TRUE , TRUE );
FOR i:= 0 TO maxn+1 DO
BEGIN
FOR j:= 0 TO maxn+1 DO
BEGIN
map[i, j].tip := 0;
map[i, j].forg:= 0;
END;
END;
END;
PROCEDURE InitMap;
VAR
i, j: INTEGER;
BEGIN
FOR i:= 0 TO maxn+1 DO
BEGIN
FOR j:= 0 TO maxn+1 DO
BEGIN
map[i, j].tav:= -1;
map[i, j].kesz:= FALSE;
END;
END;
END;
PROCEDURE Load;
VAR
T: Text;
i, j, kod: INTEGER;
BEGIN
Assign(T, inputFile);
Reset(T);
ReadLn(T, N, M);
FOR i:= 1 TO N DO
BEGIN
FOR j:= 1 TO M DO
BEGIN
Read(T, kod);
map[i, j].tip := kod DIV 10;
map[i, j].forg:= kod MOD 10;
END;
ReadLn(T);
END;
ReadLn(T, s1, o1, s2, o2);
Close(T);
END;
PROCEDURE Modify(i, j: BYTE; di, dj: SHORTINT; tav: INTEGER);
VAR
tip1, forg1, tip2, forg2: BYTE;
BEGIN
IF NOT ((map[i+di, j+dj].tav < 0) OR (tav < map[i+di, j+dj].tav)) THEN EXIT;
tip1:= map[i, j].tip; forg1:= map[i, j].forg;
tip2:= map[i+di, j+dj].tip; forg2:= map[i+di, j+dj].forg;
IF ((kodok[tip1, forg1, di, dj] = TRUE)
AND (kodok[tip2, forg2, -di, -dj] = TRUE)) THEN
BEGIN
map[i+di, j+dj].tav:= tav;
END;
END;
PROCEDURE Spread1(i, j: BYTE);
VAR
tav: INTEGER;
BEGIN
tav:= map[i, j].tav;
IF (tav >= 0) THEN
BEGIN
Modify(i, j, 1, 0, tav+1);
Modify(i, j, -1, 0, tav+1);
Modify(i, j, 0, 1, tav+1);
Modify(i, j, 0, -1, tav+1);
END;
END;
PROCEDURE Spread2(i, j: BYTE);
VAR
tav: INTEGER;
forg: BYTE;
BEGIN
tav:= map[i, j].tav;
IF (tav >= 0) THEN
BEGIN
FOR forg:= 0 TO 3 DO
BEGIN
Modify(i, j, 1, 0, tav+1+forg);
Modify(i, j, -1, 0, tav+1+forg);
Modify(i, j, 0, 1, tav+1+forg);
Modify(i, j, 0, -1, tav+1+forg);
INC(map[i, j].forg);
IF map[i, j].forg >= 4 THEN map[i, j].forg:= 0;
END;
END;
END;
PROCEDURE Dump;
VAR
i, j: INTEGER;
BEGIN
FOR i:=1 TO N DO
BEGIN
FOR j:= 1 TO m DO
BEGIN
Write(map[i, j].tav:3, ' ');
END;
WriteLn;
END;
END;
FUNCTION GetMin(VAR s, o: BYTE): BOOLEAN;
VAR
i, j: INTEGER;
van: BOOLEAN;
BEGIN
van:= FALSE;
FOR i:= 1 TO N DO
BEGIN
FOR j:= 1 TO M DO
BEGIN
IF (map[i, j].tav >= 0) AND (map[i, j].kesz = FALSE) THEN
BEGIN
IF (van = FALSE) THEN
BEGIN
s:= i; o:= j; van:= TRUE;
END
ELSE
BEGIN
IF (map[s, o].tav > map[i, j].tav) THEN
BEGIN
s:= i; o:= j;
END;
END;
END;
END;
END;
IF van THEN map[s, o].kesz:= TRUE;
getMin:= van;
END;
PROCEDURE Megold;
VAR
s, o: BYTE;
cycles: INTEGER;
i, j: BYTE;
go: BOOLEAN;
BEGIN
InitMap;
map[s1, o1].tav:= 0;
cycles:=0;
WHILE getMin(s, o) DO
BEGIN
Spread1(s, o);
INC(cycles);
END;
WriteLn('cycles= ', cycles);
WriteLn(map[s2, o2].tav);
InitMap;
map[s1, o1].tav:= 0;
cycles:= 0;
WHILE getMin(s, o) DO
BEGIN
INC(cycles);
Spread2(s, o);
END;
WriteLn('cycles= ', cycles);
WriteLn(map[s2, o2].tav);
END;
BEGIN
Init;
Load;
Megold;
END.