Cod sursa(job #2539091)

Utilizator cristiemanuelstroe cristian emanuel cristiemanuel Data 5 februarie 2020 16:48:33
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include    <iostream>

#include    <fstream>

#include    <cstring>

#include    <queue>

#include    <climits>

#include    <algorithm>



using namespace std;



ifstream fin("rj.in");

ofstream fout("rj.out");

 struct vecin{
   int linie,coloana;
 };

const int nmax=105;

const int di[]={0,1,1,1,0,-1,-1,-1};

const int dj[]={1,1,0,-1,-1,-1,0,1};

int M[nmax][nmax],R[nmax][nmax],J[nmax][nmax];

string  s[nmax];

int n,m,startRx,startRy,startJx,startJy;

queue <vecin>coada;
vecin T;

void citire()

{

    fin>>n>>m;
    fin.get();
    for(int i=1;i<=n;i++){
            getline(fin,s[i]);
        for(int j=0;j<m;j++){
        if(s[i][j]=='R')
            startRx=i,startRy=j;
        else if(s[i][j]=='J')
            startJx=i,startJy=j;
            else if(s[i][j]=='X')
             M[i][j]=-1;
        }
    }

}

void afis(int x[nmax][nmax])
{
    for(int i=1;i<=n;i++,cout<<endl)
      for(int j=0;j<m;j++)
        cout<<x[i][j]<<' ';
    cout<<endl;
}


inline bool ok(int i, int j)

{

    if(i<1 || j<0 || i>n || j>=m)

        return false;

    if(M[i][j]==-1)
        return false;
    return true;

}
void lee()

{

    int i,j;

    R[startRx][startRy]=1;
    M[startRx][startRy]=1;
    T.linie=startRx;
    T.coloana=startRy;
    coada.push(T);
    while(!coada.empty())

    {

        T=coada.front();
        i=T.linie;
        j=T.coloana;
        coada.pop();
        for(int directie=0;directie<8;directie++)

        {

           int i_nou=i+di[directie];
           int j_nou=j+dj[directie];
            if(ok(i_nou,j_nou) && R[i_nou][j_nou]==0){
               R[i_nou][j_nou]=R[i][j]+1;
               T.linie=i_nou;
               T.coloana=j_nou;
            coada.push(T);
            }
        }
    }
    T.linie=startJx;
    T.coloana=startJy;
   coada.push(T);
    J[startJx][startJy]=1;
    M[startJx][startJy]=1;
    while(!coada.empty())

    {

       T=coada.front();
       int x=T.linie;
       int y=T.coloana;
       coada.pop();
        for(int directie=0;directie<8;directie++)
        {
           int i_nou=x+di[directie];
           int j_nou=y+dj[directie];
            if(ok(i_nou,j_nou) && J[i_nou][j_nou]==0){
               J[i_nou][j_nou]=J[x][y]+1;
               T.linie=i_nou;
               T.coloana=j_nou;
            coada.push(T);
            }

        }



    }

}

void rez()

{

    int minn=INT_MAX,poz,poz1;

    for(int i=1;i<=n;i++)

      for(int j=0;j<m;j++)

          if(R[i][j]==J[i][j] && R[i][j]>0){
             if(R[i][j]<minn)
                minn=R[i][j],poz=i,poz1=j+1;
      }
      fout<<minn<<' '<<poz<<' '<<poz1<<'\n';
}



int main()

{

    citire();
  lee();
rez();

}