Informatika gyűjtemény

Egy szinttel feljebb fg_hegyseg.pas

2004050607080910

NézetNyomtat

fg_hegyseg.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: 2 KB
{
Hegyseg (2001, 3.kat, 3.ford, 3.feladat)
url: http://nttv.gyakg.u-szeged.hu/donto/Nttv01d3.htm
}
{$R+} {$Q+}


PROGRAM hegyseg;
CONST
    inputFile = '';

    maxn = 100;

VAR
    N, M: INTEGER;
    map: ARRAY [1..maxn, 1..maxn] OF RECORD
        hi: INTEGER;
        max: INTEGER;
    END;

PROCEDURE Load;
VAR
    T: Text;
    i, j: INTEGER;
    s: STRING;
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, map[i, j].hi);
            map[i, j].max:= 0;
        END;
        ReadLn(T);
    END;
END; {Load}

FUNCTION Update(i, j, i1, j1: INTEGER): BOOLEAN;
BEGIN
    IF (i1 < 1) OR (j1 < 1) OR (i1 > N) OR (j1 > M) THEN
    BEGIN
        Update:= FALSE;
        EXIT;
    END;

    IF (map[i1, j1].hi < map[i, j].hi) THEN
    BEGIN
        IF map[i1, j1].max + 1 > map[i, j].max THEN
        BEGIN
            map[i, j].max:= map[i1, j1].max + 1;
            Update:= TRUE;
        END
        ELSE Update:= FALSE;
    END
    ELSE Update:= FALSE;
END; {Update}

FUNCTION Up0(i, j: INTEGER): BOOLEAN;
VAR
    modif: BOOLEAN;
BEGIN
    modif:= FALSE;
    IF Update(i, j, i+1, j) THEN
    BEGIN
        modif:= TRUE;
    END;
    IF Update(i, j, i-1, j) THEN
    BEGIN
        modif:= TRUE;
    END;
    IF Update(i, j, i , j+1) THEN
    BEGIN
        modif:= TRUE;
    END;
    IF Update(i, j, i , j-1) THEN
    BEGIN
        modif:= TRUE;
    END;
    Up0:= modif;
END; {Up0}

PROCEDURE Process;
VAR
    modif: BOOLEAN;
    i, j: INTEGER;
    max_i, max_j: INTEGER;
BEGIN
    REPEAT
        modif:= FALSE;
        FOR i:= 1 TO N DO
        BEGIN
            FOR j:= 1 TO M DO
            BEGIN
                modif:= modif OR Up0(i, j);
            END;
        END;
    UNTIL NOT modif;

    max_i:= 1; max_j:= 1;
    FOR i:= 1 TO N DO
    BEGIN
        FOR j:= 1 TO M DO
        BEGIN
            IF map[i, j].max > map[max_i, max_j].max THEN
            BEGIN
                max_i:= i;
                max_j:= j;
            END;
        END;
    END;
    WriteLn(map[max_i, max_j].max);
    WriteLn(max_i, ' ', max_j);
END; {Process}

BEGIN
    Load;
    Process;
END.
(Vissza)