Cod sursa(job #1660246)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 22 martie 2016 21:56:02
Problema Rj Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 3.17 kb
#include<stdio.h>

FILE *in, *out;

int poz, start, v[105][105], gay[105][105], m, n, coada[10010][2];
int trece[8][2] = {{1, 0}, {1, 1}, {0, 1}, {1, -1}, {0, -1}, {-1, 0}, {-1, -1}, {-1, 1}};

void lee(int (*mat)[105][105], int x, int y)
{
    int i;
//printf("%d %d\n", x, y);
    for(i = 0; i < 8; i++) {
        if((*mat)[x + trece[i][0]][y + trece[i][1]] == 0 || ((*mat)[x + trece[i][0]][y + trece[i][1]] > (*mat)[x][y] + 1 && ((*mat)[x + trece[i][0]][y + trece[i][1]] != -1))) {
			(*mat)[x + trece[i][0]][y + trece[i][1]] = (*mat)[x][y] + 1;
			coada[poz][0] = x + trece[i][0];
			coada[poz][1] = y + trece[i][1];
			poz++;
		}
    }
    //printf("%d ", poz);
    if(start > poz - 1) {
        return;
    } else {
			start++;

        lee(mat, coada[start - 1][0], coada[start - 1][1]);
    }
}



int main ()
{

    int i, j, rx, ry, jx, jy, mini, minj;
    char c;

    in = fopen("rj.in", "r");
    out = fopen("rj.out", "w");

    fscanf(in, "%d%d", &n, &m);
    c = fgetc(in);
    //printf("asdasd");
    //write(2, "ole\n", 4);

    for(i = 0; i <= n + 1; i++) {
        v[i][0] = gay[i][0] = -1;
        v[i][m + 1] = gay[i][m + 1] = -1;
    }
    for(j = 0; j <= m + 1; j++) {
        v[0][j] = gay[0][j] = -1;
        v[n + 1][j] = gay[n + 1][j] = -1;
    }
    //write(2, "ole\n", 4);

    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) {
            c = fgetc(in);
            //printf("%c.", c);
            switch(c) {
                case ' ':
                    v[i][j] = 0;
                    break;
                case 'R':
                    rx = i;
                    ry = j;
                    v[i][j] = 0;
                    break;
                case 'J':
                    jx = i;
                    jy = j;
                    v[i][j] = 0;
                    break;
                case 'X':
                    v[i][j] = -1;
                    break;
            }
            gay[i][j] = v[i][j];
        }
        //printf("\n");
        fgetc(in);
    }
    /*
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) {
            fprintf(stdout, "%2d ", v[i][j]);
        }
        fprintf(stdout, "\n");
    }
    */
    //write(2, "ole\n", 4);
    poz = 0;
    start = 0;
    v[rx][ry] = 1;
    lee(&v, rx, ry);
    /*
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) {
            fprintf(stdout, "%2d ", v[i][j]);
        }
        fprintf(stdout, "\n");
    }
    //*/
    poz = 0;
    start = 0;
    gay[jx][jy] = 1;
    lee(&gay, jx, jy);
    /*
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) {
            fprintf(stdout, "%2d ", gay[i][j]);
        }
        fprintf(stdout, "\n");
    }
    //*/
    //write(2, "ole\n", 4);
    mini = jx;
    minj = jy;
    //printf("   %d %d %d \n", mini, minj, v[mini][minj]);
    for(i = 1; i <= n; i++) {
        for(j = 1; j <= m; j++) {
            if(v[i][j] == gay[i][j] && v[i][j] > 0) {
            //printf("poponel %d %d....\n", i, j);
                if(v[i][j] < v[mini][minj]) {
                    mini = i;
                    minj = j;
                }
            }
        }
    }
    fprintf(out, "%d %d %d", v[mini][minj], mini, minj);

    fclose(in);
    fclose(out);

    return 0;
}