Cod sursa(job #2166732)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 13 martie 2018 18:39:39
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <stdio.h>

using namespace std;

const int dmax=102;

struct crd
{
    int l,c;
};

int mr[dmax][dmax];
int mj[dmax][dmax];
crd Q[dmax*dmax];
int first,last;

int dir[][2]={{1,0}, //N
        {-1,0}, //S
        {0,-1}, //W
        {0, 1}, //E
        {-1, -1}, //Ul
        {-1, 1}, // UR
        {1, -1}, //DL
        {1, 1}}; //DR

void Lee(crd s, int m[][102])
{
    int i;
    crd x,ans;

    Q[0]=s;
    first=last=0;
    m[s.l][s.c]=1;


    while (first <= last)
    {
        x=Q[first++];
        for (i=0; i<8; i++)
        {
            int l=x.l+dir[i][0];
            int c=x.c+dir[i][1];
            if (m[l][c] == 0)//nu am vizitat pozitia (l,c)
            {
                last++;
                Q[last].l=l;
                Q[last].c=c;
                //pun in coada pozitia respectiva
                m[l][c]=m[x.l][x.c]+1;
                //semnalez ca pozitia (l,c) e vizitata
            }
        }
    }

}

int main()
{
    FILE *f;
    f=fopen("rj.in","r");
    int n,m,i,j;
    char x;
    crd rm,jl;

    fscanf(f,"%d%d",&n,&m);
    fscanf(f,"%c",&x);//!!
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
        {
            fscanf(f,"%c",&x);
            if (x == 'R')
            {
                rm.l=i;
                rm.c=j;
            }
            if (x == 'J')
            {
                jl.l=i;
                jl.c=j;
            }
            if (x == 'X')
            {
                mr[i][j]=mj[i][j]=-1;
            }
           // printf("%c",x);
        }
        //printf("\n");
        fscanf(f,"%c",&x);//!!
    }
    fclose(f);

    for (i=0; i<=n+1; i++)
        mr[i][0]=mr[i][m+1]=mj[i][0]=mj[i][m+1]=-1;
    for (j=0; j<=m+1; j++)
        mr[0][j]=mr[n+1][j]=mj[0][j]=mj[n+1][j]=-1;;

    Lee(rm,mr);
    Lee(jl,mj);
    int sol=dmax*dmax;
    crd crsol;
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
        {
            if (mr[i][j] == mj[i][j] && mr[i][j] < sol && mr[i][j] > 1)
            {
                sol=mr[i][j];
                crsol.l=i;
                crsol.c=j;
            }
        }
    }
    
    f=fopen("rj.out","w");
    fprintf(f,"%d %d %d",sol, crsol.l, crsol.c);
    fclose(f);

    /*for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
            printf("%d ",mr[i][j]);
        printf("\n");
    }
    printf("\n");
    for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
            printf("%d ",mj[i][j]);
        printf("\n");
    }*/

    return 0;
}