NézetNyomtat

fg_zomb.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: 3 KB
{$R+} {$Q+}
PROGRAM zombi;
CONST
    fileBase = 'zombi';
    extBe = 'be';
    extKi = 'kix';

    maxn = 101;

    maxIdo = maxn*maxn*2+1; {a lehetseges maximalis ertek}


VAR
    inputFile, outputFile : STRING;
    id: BYTE;

    N, M: BYTE;
    map: ARRAY [0..maxn+1, 0..maxn+1] OF CHAR; {10Kb}
    ido: ARRAY [0..maxn+1, 0..maxn+1] OF INTEGER; {20Kb}
    osszido: INTEGER;

PROCEDURE Init;
VAR
    sor, oszlop: BYTE;
BEGIN
    FOR sor:= 0 TO maxn+1 DO
    BEGIN
        FOR oszlop:= 0 TO maxn+1 DO
        BEGIN
            ido[sor, oszlop]:= maxIdo;
            map[sor, oszlop]:= '#';
        END;
    END;
END; {Init}

PROCEDURE Betolt;
VAR
    T: Text;
    sor, oszlop: BYTE;
BEGIN
    Assign(T, inputFile);
    Reset(T);
    ReadLn(T, N, M);
    FOR sor:= 1 TO N DO
    BEGIN
        FOR oszlop:= 1 TO M DO
        BEGIN
            Read(T, map[sor, oszlop]);
        END;
        ReadLn(T);
    END;
    Close(T);
END; {Betolt}

PROCEDURE UtKeres(VAR osszido: INTEGER);
VAR
    volt: BOOLEAN;
    sor, oszlop: BYTE;
    ujido: INTEGER;

    PROCEDURE Szomszed(s, o: BYTE);
    BEGIN
        IF (map[s, o] <> '#') AND (ujido < ido[s, o]) THEN
        BEGIN
            ido[s, o]:= ujido;
            volt:= TRUE;
        END;
    END; {Szomszed}

BEGIN
    ido[N, M]:= 0;

    REPEAT
        volt:= FALSE;
        FOR sor:= 1 TO N DO
        BEGIN
            FOR oszlop:= 1 TO M DO
            BEGIN
                IF (map[sor, oszlop] <> '#') AND
                    (ido[sor, oszlop] < maxIdo) THEN
                BEGIN
                    ujido:= ido[sor, oszlop];
                    IF map[sor, oszlop] = 'Z' THEN INC(ujido, 2)
                    ELSE INC(ujido);
                    Szomszed(sor+1, oszlop);
                    Szomszed(sor-1, oszlop);
                    Szomszed(sor, oszlop+1);
                    Szomszed(sor, oszlop-1);
                END;
            END;
        END;
    UNTIL volt = FALSE;

    osszido:= ido[1, 1];
    IF map[1, 1] = 'Z' THEN INC(osszido, 2)
    ELSE INC(osszido);
   
{
    teszteleshez:
    WriteLn(osszido);
    FOR sor:= 1 TO N DO
    BEGIN
        FOR oszlop:= 1 TO M DO
        BEGIN
            IF map[sor, oszlop] = '#' THEN Write('###')
            ELSE
            BEGIN
                Write(map[sor, oszlop], ido[sor,oszlop]:2)
            END;
        END;
        WriteLn;
    END;
    ReadLn;
}
END; {UtKeres}

FUNCTION Lehete(sor, oszlop, sz_sor, sz_oszlop: BYTE): BOOLEAN;
VAR
    t: INTEGER;
BEGIN
    IF map[sz_sor, sz_oszlop] <> '#' THEN
    BEGIN
        t:= ido[sz_sor, sz_oszlop];
        IF map[sz_sor, sz_oszlop] = 'Z' THEN INC(t, 2)
        ELSE INC(t);
        Lehete:= (= ido[sor, oszlop]);
    END
    ELSE Lehete:= FALSE;
END; {Lehete}

PROCEDURE Kiir;
VAR
    sor, oszlop: BYTE;
    T: Text;


BEGIN
    Assign(T, outputFile);
    Rewrite(T);
    WriteLn(T, osszido);

    sor:= 1; oszlop:= 1;

    WriteLn(T, sor, ' ', oszlop);
    REPEAT
        IF      Lehete(sor, oszlop, sor+1, oszlop) THEN INC(sor)
        ELSE IF Lehete(sor, oszlop, sor-1, oszlop) THEN DEC(sor)
        ELSE IF Lehete(sor, oszlop, sor, oszlop+1) THEN INC(oszlop)
        ELSE IF Lehete(sor, oszlop, sor, oszlop-1) THEN DEC(oszlop);

        WriteLn(T, sor, ' ', oszlop);
    UNTIL ido[sor, oszlop] = 0;

    Close(T);
END; {Kiir}

BEGIN
    {FOR id:= 0 TO 8 DO}
    Write('sorszam: '); ReadLn(id);
    BEGIN
        inputFile:= fileBase+CHR(id+ORD('0'))+'.'+extBe;
        outputFile:= fileBase+CHR(id+ORD('0'))+'.'+extKi;
        Init;
        Betolt;
        UtKeres(osszido);
        Kiir;
    END;
END.
(Vissza)