Informatika gyűjtemény

Egy szinttel feljebb mb_parc.c

2004050607080910

NézetNyomtat

mb_parc.c (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
/*
 * Meszaros Balazs, 2006-11-27
 *
 * Forditas keprajzolas nelkul:
 * gcc -o parcella parcella.c -Wall
 * ./parcella < bemenet > kimenet
 *
 * Forditas keprajzolassal (kell libgd):
 * gcc -o parcella parcella.c -Wall -DKEP -lgd
 * ./parcella < bemenet > kimenet 2> kep.png
 */
#include <stdio.h>

#ifdef KEP
#include <gd.h>

#define NEGYZET 10
#endif

typedef struct {
    int x;
    int y;
} mezo_t;

typedef struct {
    mezo_t bf;
    mezo_t ja;
} parcella_t;

parcella_t p[3001];
int k;

#ifdef KEP
int kep_x, kep_y;
#endif

void berak(int x, int y)
{
    parcella_t *q;
    int i, bf_x, bf_y, ja_x, ja_y;

    for (= 0; i < k; i++) {
        q = &p[i];
        if (q->bf.<= x && q->bf.<= y &&
            q->ja.>= x && q->ja.>= y) {
            bf_x = q->bf.x;
            bf_y = q->bf.y;
            ja_x = q->ja.x;
            ja_y = q->ja.y;

            q->ja.= x - 1;
            q->ja.= y - 1;

            q = &p[k++];
            q->bf.= x + 1;
            q->bf.= bf_y;
            q->ja.= ja_x;
            q->ja.= y - 1;

            q = &p[k++];
            q->bf.= bf_x;
            q->bf.= y + 1;
            q->ja.= x - 1;
            q->ja.= ja_y;

            q = &p[k++];
            q->bf.= x + 1;
            q->bf.= y + 1;
            q->ja.= ja_x;
            q->ja.= ja_y;

            return;
        }
    }
}

int beolvas(void)
{
    int i, x, y, z;

    if (scanf("%d %d %d", &x, &y, &z) != 3) {
        printf("hibas bemenet\n");
        return 0;
    }

    p[0].bf.= 0;
    p[0].bf.= 0;
    p[0].ja.= x - 1;
    p[0].ja.= y - 1;
    k = 1;

#ifdef KEP
    kep_x = x;
    kep_y = y;
#endif

    for (= 0; i < z; i++) {
        if (scanf("%d %d", &x, &y) != 2) {
            printf("hibas bemenet\n");
            return 0;
        }

        berak(- 1, y - 1);
    }

    return 1;
}

void kiir(void)
{
#ifdef KEP
    gdImagePtr im;
    int feher, fekete, piros, maxx, maxy;
    parcella_t *pmax = 0;
#endif
    int i, max = 0, t;
    parcella_t *q;

#ifdef KEP
    maxx = kep_x * NEGYZET;
    maxy = kep_y * NEGYZET;

    im = gdImageCreate(maxx + 1, maxy + 1);
    if (!im) {
        printf("nem tudom letrehozni a kepet\n");
        return;
    }

    feher = gdImageColorAllocate(im, 255, 255, 255);
    fekete = gdImageColorAllocate(im, 0, 0, 0);
    piros = gdImageColorAllocate(im, 255, 0, 0);

    for (= 0; i < kep_x; i++)
        gdImageLine(im, 0, i * NEGYZET, maxx, i * NEGYZET, fekete);

    for (= 0; i < kep_y; i++)
        gdImageLine(im, i * NEGYZET, 0, i * NEGYZET, maxy, fekete);

    gdImageLine(im, 0, maxy, maxx, maxy, fekete);
    gdImageLine(im, maxx, 0, maxx, maxy, fekete);
#endif

    for (= 0; i < k; i++) {
        q = &p[i];

        if (q->bf.> q->ja.|| q->bf.> q->ja.y)
            continue;

        t = (q->ja.- q->bf.+ 1) * (q->ja.- q->bf.+ 1);
        if (> max) {
            max = t;
#ifdef KEP
            pmax = q;
#endif
        }

#ifdef KEP
        gdImageFilledRectangle(im, q->bf.* NEGYZET,
                       q->bf.* NEGYZET,
                       (q->ja.+ 1) * NEGYZET,
                       (q->ja.+ 1) * NEGYZET, fekete);
#endif
    }

    printf("%d\n", max);

#ifdef KEP
    if (pmax)
        gdImageFilledRectangle(im, pmax->bf.* NEGYZET,
                       pmax->bf.* NEGYZET,
                       (pmax->ja.+ 1) * NEGYZET,
                       (pmax->ja.+ 1) * NEGYZET, piros);

    gdImagePng(im, stderr);

    gdImageDestroy(im);
#endif
}

int main(void)
{
    if (!beolvas())
        return 1;

    kiir();

    return 0;
}
(Vissza)