Cod sursa(job #1594971)

Utilizator danib99Buhaianu Daniel danib99 Data 9 februarie 2016 20:52:35
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.53 kb
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin ("rj.in");
ofstream fout ("rj.out");

queue < pair <int,int> > coada;

int dl[8]={-1,-1,1,-1,1,-1,0,0};
int dc[8]={-1,1,1,-1,0,0,-1,1};

int N,M,A[101][101],B[101][101],startJx,startJy,startRx,startRy;char s[101][101];

void Read()
{
    fin>>N>>M;fin.get();
    for(int i=1;i<=N;i++)
    {
        fin.getline(s[i],M+1);
        for(int j=0;j<strlen(s[i]);j++)
            if(s[i][j]=='R')
            {
                A[i][j+1]=1;B[i][j+1]=1;
                startRx=i;
                startRy=j+1;
            }
        else
            if(s[i][j]=='J')
            {
                A[i][j+1]=1;B[i][j+1]=1;
                startJx=i;
                startJy=j+1;
            }
        else
            if(s[i][j]=='X')
           {
               A[i][j+1]=-2;B[i][j+1]=-2;
           }
        else
            {
                A[i][j+1]=-1;B[i][j+1]=-1;
            }
    }
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
        if(A[i][j]==0)
       {
           A[i][j]=-1;B[i][j]=-1;
       }

}
bool OK(int i,int j,int A[101][101])
{
    if(i<1||j<1||i>N||j>M)
        return false;
    if(A[i][j]==-2||A[i][j]==1)
        return false;

    return true;
}

void Romeo()
{
    int i,j,i_urmator,j_urmator;
    coada.push(make_pair(startRx,startRy));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int distanta=0;distanta<8;distanta++)
        {
            i_urmator= i+dl[distanta];
            j_urmator= j+dc[distanta];
            if(OK(i_urmator,j_urmator,A)&&A[i_urmator][j_urmator]<1)
            {
                A[i_urmator][j_urmator]=A[i][j]+1;
                coada.push(make_pair(i_urmator,j_urmator));
            }
        }
    }
    coada.push(make_pair(startJx,startJy));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int distanta=0;distanta<8;distanta++)
        {
            i_urmator= i+dl[distanta];
            j_urmator= j+dc[distanta];

            if(OK(i_urmator,j_urmator,A)&&A[i_urmator][j_urmator]<1)
            {
                A[i_urmator][j_urmator]=A[i][j]+1;
                coada.push(make_pair(i_urmator,j_urmator));
            }
        }
    }

}

void Julieta()
{
    int i,j,i_urmator,j_urmator;
    coada.push(make_pair(startJx,startJy));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int distanta=0;distanta<8;distanta++)
        {
            i_urmator= i+dl[distanta];
            j_urmator= j+dc[distanta];
            if(OK(i_urmator,j_urmator,B)&&B[i_urmator][j_urmator]<1)
            {
                B[i_urmator][j_urmator]=B[i][j]+1;
                coada.push(make_pair(i_urmator,j_urmator));
            }
        }
    }
    coada.push(make_pair(startRx,startRy));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int distanta=0;distanta<8;distanta++)
        {
            i_urmator= i+dl[distanta];
            j_urmator= j+dc[distanta];

            if(OK(i_urmator,j_urmator,B)&&B[i_urmator][j_urmator]<1)
            {
                B[i_urmator][j_urmator]=B[i][j]+1;
                coada.push(make_pair(i_urmator,j_urmator));
            }
        }
    }
}
void afisare()
{
    for(int i=1;i<=N;i++)
        {
            int ok=1;
            for(int j=1;j<=M;j++)
                if(A[i][j]==B[i][j])
                    if(A[i][j]>1)
                    {
                        fout<<A[i][j]<<' '<<i<<' '<<j;
                        ok=0;
                        break;
                    }
            if(ok==0)
                break;
        }

}
/*void completare(int A[101][101])
{
    for(int i=1;i<=N;i++)
    {
        int i_urmator,j_urmator;
        for(int j=1;j<=M;j++)
            if(A[i][j]>1)
                for(int distanta=0;distanta<8;distanta++)
            {
                i_urmator= i+dl[distanta];
                j_urmator= j+dc[distanta];


            }
    }
}*/
/*void afisare1(int A[101][101])
{
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
            fout<<A[i][j]<<' ';
        fout<<'\n';
    }
}*/
int main()
{
    Read();
    Romeo();
    Julieta();
    afisare();

    return 0;
}