Cod sursa(job #1589642)

Utilizator MihaiBurduhosuBurduhosu Mihai MihaiBurduhosu Data 4 februarie 2016 11:30:12
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("rj.in");
ofstream fout ("rj.out");
struct coada
{
    short int l,c;
} C[110*110],p,v,pr,pj;
short int MR[110][110],MJ[110][110];
char car;
short int i,j,k,n,m,prim,ultim;
short int dl[]={-1,0,1,0,-1,-1,1,1}, dc[]={0,-1,0,1,-1,1,-1,1};
bool ajuns,gasit;
int main()
{
    fin>>n>>m;
    fin.get();
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            fin.get(car);
            if(car=='\n') break;
            if(car=='R')
            {
                pr.l=i;
                pr.c=j;
            }
            if(car=='J')
            {
                pj.l=i;
                pj.c=j;
            }
            if(car=='X')
                MR[i][j]=MJ[i][j]=-1;
        }
        if(car!='\n')
            fin.get();
    }
    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;
    C[prim]=pr;
    while(prim<=ultim)
    {
        p=C[prim++];
        for(k=0;k<8;k++)
        {
            v.l=p.l+dl[k];
            v.c=p.c+dc[k];
            if(MR[v.l][v.c]==0)
            {
                MR[v.l][v.c]=MR[p.l][p.c]+1;
                if(v.l==pj.l && v.c==pj.c)
                {
                    ajuns=true;
                    break;
                }
                C[++ultim]=v;
            }
        }
        if(ajuns==true)
            break;
    }
    ajuns=false;
    prim=ultim=0;
    C[prim]=pj;
        while(prim<=ultim)
    {
        p=C[prim++];
        for(k=0;k<8;k++)
        {
            v.l=p.l+dl[k];
            v.c=p.c+dc[k];
            if(MJ[v.l][v.c]==0)
            {
                MJ[v.l][v.c]=MJ[p.l][p.c]+1;
                if(v.l==pr.l && v.c==pr.c)
                {
                    ajuns=true;
                    break;
                }
                C[++ultim]=v;
            }
        }
        if(ajuns==true)
            break;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(MR[i][j]==MJ[i][j] && MR[i][j]>0)
            {
                fout<<MR[i][j]+1<<' '<<i<<' '<<j;
                gasit=true;
                break;
            }
        }
        if(gasit)
            break;
    }
    return 0;
}