Cod sursa(job #2534558)

Utilizator cristiemanuelstroe cristian emanuel cristiemanuel Data 30 ianuarie 2020 18:45:08
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include    <iostream>
#include    <fstream>
#include    <cstring>
#include    <queue>
#include    <climits>

using namespace std;

ifstream fin("rj.in");
ofstream fout("rj.out");

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];
char s[nmax];
int n,m,startRx,startRy,startJx,startJy;
queue < pair <int, int> >coada;
queue < pair <int, int> >coada2;
void citire()
{
    fin>>n>>m;
    fin.get();
    for(int i=1;i<=n;i++){
            fin.getline(s,nmax);
        for(int j=0;j<m;j++){
        if(s[j]=='X')
            M[i][j]=-1;
        else if(s[j]=='R')
            startRx=i,startRy=j+1;
        else if(s[j]=='J')
            startJx=i,startJy=j+1;
        }

    }
}

inline bool ok(int i, int j)
{
    if(i<1 || j<1 || i>n || j>m)
        return false;
    if(R[i][j]==-1)
        return false;
    return true;
}

inline bool ok1(int i, int j)
{
    if(i<1 || j<1 || i>n || j>m)
        return false;
    if(J[i][j]==-1)
        return false;
    return true;
}


void lee()
{
    int i,j;
    R[startRx][startRy]=1;
    coada.push(make_pair(startRx,startRy));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        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;
            coada.push(make_pair(i_nou,j_nou));
            }
        }
    }
   coada2.push(make_pair(startJx,startJy));
    J[startJx][startJy]=1;
    while(!coada2.empty())
    {
       int x=coada2.front().first;
       int y=coada2.front().second;
       coada2.pop();
        for(int directie=0;directie<8;directie++)
        {
           int i_nou=x+di[directie];
           int j_nou=y+dj[directie];
            if(ok1(i_nou,j_nou) && J[i_nou][j_nou]==0){
               J[i_nou][j_nou]=J[x][y]+1;
            coada2.push(make_pair(i_nou,j_nou));
            }
        }

    }
}

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]){
             if(R[i][j]<minn)
                minn=R[i][j],poz=i,poz1=j+1;
      }
      fout<<minn<<' '<<poz<<' '<<poz1;
}
// 3 3 2
int main()
{
    citire();
    lee();
    rez();
}