Cod sursa(job #615788)

Utilizator caen1c a e n caen1 Data 10 octombrie 2011 21:47:45
Problema Rj Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <stdio.h>

#define IN "rj.in"
#define OUT "rj.out"
#define N 101

typedef struct {

    int x, y, t;
} Punct;

Punct r[N * N], jl[N * N];
int ic, sc, H[N][N];
int dx[] = {0, -1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {0, -1, 0, 1, -1, 1, -1, 0, 1};

int main(void) {

    int n, m, i, j, xr, yr, xj, yj, k, l, ynou, xnou;
    char ch;
    Punct P;

    (void) freopen(IN, "r", stdin); (void) freopen(OUT, "w", stdout);

    (void) scanf("%d %d", &n, &m);
    getchar();

    /* Citire */
    for(i = 1; i <= n; ++i) {

        for(j = 1; j <= m; ++j) {

            ch = getchar();
            if(ch == 'X')
                H[i][j] = -1;
            else if(ch == 'R')
                xr = i, yr = j;
            else if(ch == 'J')
                xj = i, yj = j;
        }

        getchar();
    }

    /* Bordare */
    for(i = 0; i <= n + 1; ++i)
        H[i][0] = H[i][m + 1] = -1;
    for(i = 0; i <= m + 1; ++i)
        H[0][i] = H[n + 1][i] = -1;

    /* Lee Romeo */
    r[ic].x = xr;
    r[ic].y = yr;
    r[ic].t = 0;
    while(ic <= sc) {

        P = r[ic++];

        for(i = 1; i <= 8; ++i) {

            xnou = P.x + dx[i];
            ynou = P.y + dy[i];

            if(H[xnou][ynou] == 0) {

                H[xnou][ynou] = P.t + 1;
                ++sc;
                r[sc].x = xnou;
                r[sc].y = ynou;
                r[sc].t = P.t + 1;
            }
        }
    }
    k = sc;

    for(i = 1; i <= n; ++i)
        for(j = 1; j <= m; ++j)
            if(H[i][j] > 0)
                H[i][j] = 0;

    /* Lee Julieta */
    ic = sc = 0;
    jl[ic].x = xj;
    jl[ic].y = yj;
    jl[ic].t = 0;
    while(ic <= sc) {

        P = jl[ic++];

        for(i = 1; i <= 8; ++i) {

            xnou = P.x + dx[i];
            ynou = P.y + dy[i];

            if(H[xnou][ynou] == 0) {

                H[xnou][ynou] = P.t + 1;
                ++sc;
                jl[sc].x = xnou;
                jl[sc].y = ynou;
                jl[sc].t = P.t + 1;

                for(l = 1; l <= k; ++l) {

                    if(r[l].x == jl[sc].x && r[l].y == jl[sc].y && r[l].t == jl[sc].t) {
                        printf("%d %d %d\n", jl[sc].t + 1, jl[sc].x, jl[sc].y);
                        return 0;

                    }
                }
            }
        }
    }

    return 0;
}