Informatika gyűjtemény

Egy szinttel feljebb mb_hatszog.c

2004050607080910

NézetNyomtat

mb_hatszog.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
#include <stdio.h>

typedef struct {
    short magassag;
    short tavolsag;
} mezo_t;

mezo_t mezo[18961];
int n, mezok, p, q, r, x, y, z, magassag;

int abs(int n)
{
    return (>= 0) ? n : -n;
}

mezo_t *keres(int x, int y, int z)
{
    int index, max;

    if (+ y + z != 0)
        return 0;

    if (abs(x) >= n || abs(y) >= n || abs(z) >= n)
        return 0;

    /* ez lassu
    index = 0;
    for (i = 1 - n; i < x; i++)
        index += 2 * n - 1 - abs(i);
    */

    index = (+ n - 1) * (2 * n - 1);
    max = (< 0) ? x : 0;

    index += ((1 - n + max - 1) * (max + n - 1)) / 2;
    if (1 < x)
        index -= (* (- 1)) / 2;

    index += n - 1 - z;

    if (> 0)
        index -= x;

//  printf("(%d; %d; %d) = %d\n", x, y, z, index);

    return &mezo[index];
}

int beolvas(void)
{
    int i, magassag;

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

    mezok = (+ 2 * n - 2) * (- 1) + 2 * n - 1;
//  printf("mezo: %d\n", mezok);

    for (= 0; i < mezok; i++) {
        if (scanf("%d", &magassag) != 1) {
            printf("hibas bemenet\n");
            return 0;
        }

        mezo[i].magassag = magassag;
        mezo[i].tavolsag = -1;
    }

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

    return 1;
}

void feltolt(int x, int y, int z, int tavolsag)
{
    mezo_t *m;

    m = keres(x, y, z);
    if (!m)
        return;

    if (m->magassag != magassag)
        return;

    if (m->tavolsag >= 0 && tavolsag >= m->tavolsag)
        return;

    m->tavolsag = tavolsag;

    feltolt(- 1, y, z + 1, tavolsag + 1);
    feltolt(- 1, y + 1, z, tavolsag + 1);

    feltolt(x, y - 1, z + 1, tavolsag + 1);
    feltolt(x, y + 1, z - 1, tavolsag + 1);

    feltolt(+ 1, y - 1, z, tavolsag + 1);
    feltolt(+ 1, y, z - 1, tavolsag + 1);
}

int main(void)
{
    mezo_t *s, *t;

    if (!beolvas())
        return 1;

    /*
    keres(-2, 0, 2);
    keres(-2, 1, 1);
    keres(-1, 1, 0);
    keres(0, 0, 0);
    keres(0, 2, -2);
    keres(1, -1, 0);
    keres(1, 1, -2);
    keres(2, -1, -1);
    */

    s = keres(p, q, r);
    t = keres(x, y, z);
    if (!|| !t) {
        printf("-1\n");
    } else {
        magassag = s->magassag;
        feltolt(p, q, r, 0);
        printf("%d\n", t->tavolsag);
    }

    return 0;
}
(Vissza)