Informatika gyűjtemény

Egy szinttel feljebb fg_utv2.pas

2004050607080910

NézetNyomtat

fg_utv2.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
{
Feher Gabor, BDG Szakkor, 7.ora
- a honlap magyarazata alapjan -
}
PROGRAM Ut;
CONST
    {maximalis ertek: 255}
    N = 9;
    M = 19;

VAR
    map: ARRAY [0..N+1, 0..M+1] OF BOOLEAN;
    red: ARRAY [0..N+1, 0..M+1] OF BOOLEAN;

    volt: ARRAY [0..N+1, 0..M+1] OF BOOLEAN;

PROCEDURE Kirajzol(fal, piros: CHAR);
VAR
    sor, oszlop: BYTE;
BEGIN
    FOR sor:= 0 TO N+1 DO
    BEGIN
        FOR oszlop:= 0 TO M+1 DO
        BEGIN
            IF NOT map[sor, oszlop] THEN Write(fal)
            ELSE IF red[sor, oszlop] THEN Write(piros)
            ELSE Write(' ');
        END;
        WriteLn;
    END;
END; {Kirajzol}

FUNCTION Ut(sor1, oszlop1, sor2, oszlop2: BYTE): BOOLEAN;
VAR
    volt: BOOLEAN;
    sor, oszlop: BYTE;

    PROCEDURE Szomsz(s, o, s2, o2: BYTE; VAR volt: BOOLEAN);
    BEGIN
        IF (map[s2, o2] = TRUE) AND (red[s2, o2] = FALSE) THEN
        BEGIN
            volt:= TRUE;
            red[s2, o2]:= TRUE;
        END;
    END; {Szomsz}

BEGIN
    FOR sor:= 0 TO N+1 DO
    BEGIN
        FOR oszlop:= 0 TO M+1 DO
        BEGIN
            red[sor, oszlop]:= FALSE;
        END;
    END;
    red[sor1, oszlop1]:= TRUE;
    REPEAT
        volt:= FALSE;
        FOR sor:= 1 TO N DO
        BEGIN
            FOR oszlop:= 1 TO M DO
            BEGIN
                IF (red[sor, oszlop]) THEN
                BEGIN
                    Szomsz(sor, oszlop, sor+1, oszlop  , volt);
                    Szomsz(sor, oszlop, sor  , oszlop+1, volt);
                    Szomsz(sor, oszlop, sor-1, oszlop  , volt);
                    Szomsz(sor, oszlop, sor  , oszlop-1, volt);
                END;
            END;
        END;
    UNTIL (volt = FALSE) OR (red[sor2, oszlop2]);
    Ut:= red[sor2, oszlop2];
END; {Ut}

PROCEDURE Feltolt;
VAR
    sor, oszlop: BYTE;
BEGIN
    FOR sor:= 0 TO N+1 DO
    BEGIN
        FOR oszlop:= 0 TO M+1 DO
        BEGIN
            map[sor, oszlop]:= NOT
                ((sor = 0) OR (sor = N+1) OR (oszlop = 0) OR (oszlop = M+1) OR
                   ((sor MOD 2 = 0) AND (oszlop MOD 2 = 0)));

            volt[sor, oszlop]:= FALSE;
        END;
    END;
END; {Feltolt}

PROCEDURE Kezel(sor, oszlop: BYTE);
BEGIN
    IF sor MOD 2 = 0 THEN
    BEGIN
        {fuggoleges mezo}
        map[sor, oszlop]:= FALSE;
        map[sor, oszlop]:= NOT Ut(sor-1, oszlop, sor+1, oszlop);
    END
    ELSE
    BEGIN
        {vizszintes mezo}
        map[sor, oszlop]:= FALSE;
        map[sor, oszlop]:= NOT Ut(sor, oszlop-1, sor, oszlop+1);
    END;
END; {Kezel}

PROCEDURE Main;
VAR
    sor, oszlop: BYTE;
    osszes, maradek, szamlalo, x: INTEGER;
BEGIN
    osszes:= N * M DIV 2 - 1;
    FOR maradek:= osszes DOWNTO 1 DO
    BEGIN
        x:= Random(maradek) + 1;
        szamlalo:= 0;
        FOR sor:= 1 TO N DO
        BEGIN
            FOR oszlop:= 1 TO M DO
            BEGIN
                IF (sor MOD 2 + oszlop MOD 2 = 1) AND
                    (volt[sor, oszlop] = FALSE) THEN
                BEGIN
                    INC(szamlalo);
                    IF szamlalo = x THEN
                    BEGIN
                        volt[sor, oszlop]:= TRUE;
                        Kezel(sor, oszlop);
                        BREAK;
                    END;
                END;
            END;
            IF szamlalo = x THEN BREAK;
        END;
    END;

    map[1, 0]:= TRUE;
    map[N, M+1]:= TRUE;
    Kirajzol('#', ' ');
END; {Main}

BEGIN
    Randomize; {!!}
    Feltolt;
    Main;
END.
(Vissza)