Cod sursa(job #1834332)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 24 decembrie 2016 13:33:41
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <cstdio>
#define inf 1000000000

using namespace std;

struct IIPair { int i, j; } st[10000], pr, pj, pos;
int rom[102][102];
int jul[102][102];
int nl, nc;
int lst, r;
int d[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};

void lee(int i, int j, int mat[102][102])
{
    int k;
    lst = 1;
    r = 0;
    st[0].i = i;
    st[0].j = j;
    mat[i][j] = 1;
    while(lst > r)
    {
        i = st[r].i;
        j = st[r].j;
        for(k = 0; k < 8; k++)
        {
            if(mat[i + d[k][0]][j + d[k][1]] == 0)
            {
                mat[i + d[k][0]][j + d[k][1]] = mat[i][j] + 1;
                st[lst].i = i + d[k][0];
                st[lst++].j = j + d[k][1];
            }
        }
        r++;
    }
}

void waitNL()
{
    char c;
    do
    {
        fread(&c, 1, 1, stdin);
    }while(c != '\n');
}

int main()
{
    char c, newl = 0;
    int i, j, tmin = 1000000000;
    freopen("rj.in", "r", stdin);
    freopen("rj.out", "w", stdout);
    scanf("%d%d", &nl, &nc);
    for(i = 1; i <= nl; i++)
    {
        if(newl == 0)
            waitNL();
        newl = 0;
        for(j = 1; j <= nc && newl == 0; j++)
        {
            fread(&c, 1, 1, stdin);
            switch(c)
            {
            case 'R':
                pr.i = i;
                pr.j = j;
                break;
            case 'J':
                pj.i = i;
                pj.j = j;
                break;
            case 'X':
                rom[i][j] = inf;
                jul[i][j] = inf;
                break;
            case '\n':
                newl = 1;
                break;
            }
        }
    }
    for(i = 0; i <= nl + 1; i++)
    {
        rom[i][0] = inf;
        rom[i][nc + 1] = inf;
        jul[i][0] = inf;
        jul[i][nc + 1] = inf;
    }
    for(j = 0; j <= nc + 1; j++)
    {
        rom[0][j] = inf;
        rom[nl + 1][j] = inf;
        jul[0][j] = inf;
        jul[nl + 1][j] = inf;
    }
    lee(pr.i, pr.j, rom);
    lee(pj.i, pj.j, jul);
    for(i = 1; i <= nl; i++)
    {
        for(j = 1; j <= nc; j++)
        {
            if(rom[i][j] == jul[i][j] && rom[i][j] != 0)
            {
                if(tmin > rom[i][j])
                {
                    tmin = rom[i][j];
                    pos.i = i;
                    pos.j = j;
                }
            }
        }
    }
    printf("%d %d %d", tmin, pos.i, pos.j);
    return 0;
}