Informatika gyűjtemény

Egy szinttel feljebb villamos1a.pas

2004050607080910

NézetNyomtat

villamos1a.pas (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 4 KB
PROGRAM Villamos;
CONST
    inputFile = ''; {stdin}
    {outputFile = '';} {stdout}

    maxn = 100;

TYPE
    mezo = RECORD
        tip, forg: BYTE;
        tav: INTEGER;
    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; {Add}

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; {Init}

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;
        END;
    END;
END; {Init}

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; {Load}

PROCEDURE Modify(i, j: BYTE; di, dj: SHORTINT; tav: INTEGER; VAR go: BOOLEAN);
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)) {van koztuk el} THEN
    BEGIN
        map[i+di, j+dj].tav:= tav;
        go:= TRUE;
    END;
END; {Modify}

PROCEDURE Spread1(i, j: BYTE; VAR go: BOOLEAN);
VAR
    tav: INTEGER;
BEGIN
    tav:= map[i, j].tav;
    IF (tav >= 0) THEN
    BEGIN
        Modify(i, j,  1,  0, tav+1, go);
        Modify(i, j, -1,  0, tav+1, go);
        Modify(i, j,  0,  1, tav+1, go);
        Modify(i, j,  0, -1, tav+1, go);
    END;
END; {Spread1}

PROCEDURE Spread2(i, j: BYTE; VAR go: BOOLEAN);
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, go);
            Modify(i, j, -1,  0, tav+1+forg, go);
            Modify(i, j,  0,  1, tav+1+forg, go);
            Modify(i, j,  0, -1, tav+1+forg, go);
            INC(map[i, j].forg);
            IF map[i, j].forg >= 4 THEN map[i, j].forg:= 0;
        END;
    END;
END; {Spread2}

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; {Dump}

PROCEDURE Megold;
VAR
    go: BOOLEAN;
    i, j: BYTE;
    cycles: INTEGER;
BEGIN
    InitMap;
    map[s1, o1].tav:= 0;
    cycles:= 0;
    REPEAT
        go:= FALSE;
        FOR i:= 1 TO N DO
        BEGIN
            FOR j:= 1 TO M DO
            BEGIN
                Spread1(i, j, go);
            END;
        END;
        INC(cycles);
    UNTIL (go = FALSE);
    WriteLn('cycles= ', cycles);
    WriteLn(map[s2, o2].tav);

    InitMap;
    map[s1, o1].tav:= 0;
    cycles:= 0;
    REPEAT
        go:= FALSE;
        FOR i:= 1 TO N DO
        BEGIN
            FOR j:= 1 TO M DO
            BEGIN
                Spread2(i, j, go);
            END;
        END;
        INC(cycles);
    UNTIL (go = FALSE);

    WriteLn('cycles= ', cycles);
    WriteLn(map[s2, o2].tav);
    {Dump;}
END; {Megold}

BEGIN
    Init;
    Load;
    Megold;
END.
(Vissza)