Cod sursa(job #1467392)

Utilizator adiXMGemene Adrian adiXM Data 3 august 2015 12:44:01
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");
char a[201];
int b[105][105];
int r[105][105];
int jl[105][105];
int dl[]={-1,-1,0,1,1,1,0,-1};
int dc[]={0,1,1,1,0,-1,-1,-1};
struct Poz
{
    int lin,col;
};
int n,prim,ultim,m,xr,yr,xj,yj,pozx,pozy,t=9999999;
Poz Q[10005];
inline void Bordare(int b[105][105]){

    for(int i=0;i<=n+1;i++)
    {
        b[i][0]=-1;
        b[i][m+1]=-1;
    }
    for(int j=0;j<=m+1;j++)
    {
        b[0][j]=-1;
        b[n+1][j]=-1;
    }

}

inline void Citire()
{
    f>>n>>m;
    f.get();
    for(int i=1;i<=n;i++)
    {

        f.getline(a, 200);
        for(int j=0;j<m;j++)
        {
            if(a[j]=='X')
                b[i][j+1]=-1;
            if(a[j]=='R')
            {
                xr=i;
                yr=j+1;
                b[xr][yr]=0;
            }
            if(a[j]=='J')
            {
                xj=i;
                yj=j+1;
                b[xr][yr]=0;
            }
        }

    }

}
inline void Lee_Romeo()
{
    ultim=0;
    prim=1;
    Poz ps,p,v;
    ps.lin=xr;
    ps.col=yr;
    Q[++ultim]=ps;
    r[ps.lin][ps.col]=1;
    while(prim<=ultim)
    {
        p=Q[prim];
        prim++;
        for(int i=0;i<8;i++)
        {
            v.lin=p.lin+dl[i];
            v.col=p.col+dc[i];
            if(r[v.lin][v.col]==0 && b[v.lin][v.col]!=-1)
            {
                ultim++;
                Q[ultim]=v;
                r[v.lin][v.col]=r[p.lin][p.col]+1;
            }
        }
    }

}
inline void Lee_Julieta()
{
    ultim=0;
    prim=1;
    Poz ps,p,v;
    ps.lin=xj;
    ps.col=yj;
    Q[++ultim]=ps;
    jl[ps.lin][ps.col]=1;
    while(prim<=ultim)
    {
        p=Q[prim];
        prim++;
        for(int i=0;i<8;i++)
        {
            v.lin=p.lin+dl[i];
            v.col=p.col+dc[i];
            if(jl[v.lin][v.col]==0 && b[v.lin][v.col]!=-1)
            {
                ultim++;
                Q[ultim]=v;
                jl[v.lin][v.col]=jl[p.lin][p.col]+1;
            }
        }
    }

}
inline void Rezolva(){

    t=99999;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(r[i][j]==jl[i][j] && t>=r[i][j] && b[i][j]!=-1 && r[i][j]!=0)
            {
                t=r[i][j];
                pozx=i;
                pozy=j;
                //g<<r[i][j]<<"\n";
            }
    g<<t<<" "<<pozx<<" "<<pozy;
}
int main()
{

    Citire();
    Bordare(b);
    Bordare(r);
    Bordare(jl);
    Lee_Romeo();
    Lee_Julieta();
    Rezolva();
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            g<<jl[i][j]<<" ";
        g<<"\n";
    }*/
    return 0;
}