Cod sursa(job #2166651)

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

using namespace std;

const int dmax=102;

struct cell
{
    int step;
    char mark;
};

struct crd
{
    int l,c;
    int mark;
};

cell mp[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

crd Lee(crd rm, crd jl)
{
    int i;
    crd x,ans;

    Q[0]=rm;
    Q[1]=jl;
    first=0;
    last=1;
    mp[rm.l][rm.c].mark=rm.mark;
    mp[rm.l][rm.c].step=1;
    mp[jl.l][jl.c].mark=jl.mark;
    mp[jl.l][jl.c].step=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 (mp[l][c].mark == 0)//nu am vizitat pozitia (l,c)
            {
                last++;
                Q[last].l=l;
                Q[last].c=c;
                Q[last].mark=x.mark;
                //pun in coada pozitia respectiva
                mp[l][c].mark=x.mark;
                mp[l][c].step=mp[x.l][x.c].step+1;
                //semnalez ca pozitia (l,c) e vizitata
            }
            else if ((mp[l][c].mark == 1 && mp[x.l][x.c].mark == 2) || (mp[l][c].mark == 2 && mp[x.l][x.c].mark == 1))
            {
                ans.l=l;
                ans.c=c;
                return ans;
            }
        }
    }

}

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;
                rm.mark=1;
            }
            if (x == 'J')
            {
                jl.l=i;
                jl.c=j;
                jl.mark=2;
            }
            if (x == 'X')
            {
                mp[i][j].mark=3;
            }
           // printf("%c",x);
        }
        //printf("\n");
        //fscanf(f,"%c",&x);//!!
    }
    fclose(f);

    for (i=0; i<=n+1; i++)
        mp[i][0].mark=mp[i][m+1].mark=3;
    for (j=0; j<=m+1; j++)
        mp[0][j].mark=mp[n+1][j].mark=3;

    crd ans=Lee(rm,jl);
    f=fopen("rj.out","w");
    fprintf(f,"%d %d %d",mp[ans.l][ans.c].step, ans.l, ans.c);
    fclose(f);

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

    return 0;
}