Informatika gyűjtemény

Egy szinttel feljebb mb_zomb.c

2004050607080910

NézetNyomtat

mb_zomb.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>

#define EMPTY 0
#define ZOMBIE 1
#define WALL 2

int x, y;
char map[101][101];
unsigned short route[101][101];

void fill(int j, int i, int r)
{
    if (< 0 || j >= y || i < 0 || i >= x)
        return;

    switch (map[j][i]) {
    case EMPTY:
        r += 1;
        break;
    case ZOMBIE:
        r += 2;
        break;
    case WALL:
        return;
    }

    if (route[j][i] <= r)
        return;

    route[j][i] = r;

    fill(- 1, i, r);
    fill(+ 1, i, r);
    fill(j, i - 1, r);
    fill(j, i + 1, r);
}

void routing()
{
    int i, j;

    for (= 0; j < y; j++)
        for (= 0; i < x; i++)
            route[j][i] = 0xFFFF;

    fill(0, 0, 0);
}

void dump()
{
    int i, j;

    for (= 0; j < y; j++) {
        for (= 0; i < x; i++)
            switch (map[j][i]) {
            case EMPTY:
                printf(" %05d ", route[j][i]);
                break;
            case ZOMBIE:
                printf("Z%05dZ", route[j][i]);
                break;
            case WALL:
                printf("#######");
                break;
            }

        printf("\n");
    }
}

void getnewline()
{
    int ch;

    while (1) {
        ch = getchar();
        if (!(ch == '\r' || ch == '\n')) {
            ungetc(ch, stdin);
            return;
        }
    }
}

void min(unsigned short *min, int *nj, int *ni, int j, int i)
{
    if (< 0 || j >= y || i < 0 || i >= x)
        return;

    if (*min > route[j][i]) {
        *min = route[j][i];
        *nj = j;
        *ni = i;
    }
}

void _hop(int j, int i)
{
    unsigned short m = 0xFFFF;
    int nj, ni;

    min(&m, &nj, &ni, j - 1, i);
    min(&m, &nj, &ni, j + 1, i);
    min(&m, &nj, &ni, j, i - 1);
    min(&m, &nj, &ni, j, i + 1);

    if (>= route[j][i])
        return;

    _hop(nj, ni);

    printf("%d %d\n", j + 1, i + 1);
}

void hop()
{
    if (route[- 1][- 1] == 0xFFFF) {
        printf("Nem lehet eljutni\n");
        return;
    }

    printf("%d\n", route[- 1][- 1]);
    printf("1 1\n");

    _hop(- 1, x - 1);
}

int main()
{
    int i, j;
    int ch;

    if (scanf("%d %d", &y, &x) != 2) {
        printf("Keves parameter\n");
        return 1;
    }

    getnewline();

    for (= 0; j < y; j++) {
        for (= 0; i < x; i++) {
            ch = getchar();
            switch (ch) {
            case ' ':
            case '_':
                map[j][i] = EMPTY;
                break;
            case 'z':
            case 'Z':
                map[j][i] = ZOMBIE;
                break;
            case '#':
                map[j][i] = WALL;
                break;
            case EOF:
                printf("Keves karakter\n");
                return 0;
            default:
                printf("Ismeretlen karakter\n");
                return 0;
            }
        }

        getnewline();
    }

    routing();

    hop();

//  dump();

    return 1;
}
(Vissza)