Cod sursa(job #2565751)

Utilizator OffuruAndrei Rozmarin Offuru Data 2 martie 2020 16:36:09
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

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

int R[103][103],J[103][103],iR,jR,iJ,jJ;
int n,m;

queue <pair<int,int> > q;

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

void Citire()
{
    fin>>n>>m;
    char s[104];
    fin.getline(s,104);
    for(int i=1;i<=n;i++)
    {
        char linie[103];
        fin.getline(linie,103);

        for(int j=0;j<m;j++)
        {
            char c=linie[j];

            switch(c)
            {
            case 'X':
                R[i][j+1]=J[i][j+1]=-1;
                break;
            case ' ':
                R[i][j+1]=J[i][j+1]=0;
                break;
            case 'R':
                R[i][j+1]=J[i][j+1]=0;
                iR=i;
                jR=j+1;
                break;
            case 'J':
                R[i][j+1]=J[i][j+1]=0;
                iJ=i;
                jJ=j+1;
            }
        }
    }
}

void Bordare()
{
    for(int i=0;i<=n+1;i++)
        R[i][0]=R[i][m+1]=J[i][0]=J[i][m+1]=-1;
    for(int j=0;j<=m+1;j++)
        R[0][j]=R[n+1][j]=J[0][j]=J[n+1][j]=-1;
}

void LeeR()
{
    q.push({iR,jR});
    while(!q.empty())
    {
        int i=q.front().first,j=q.front().second;

        for(int k=0;k<4;k++)
        {
            int vi=i+di[k],vj=j+dj[k];

            if(R[vi][vj]==0)
            {
                R[vi][vj]=R[i][j]+1;
                q.push({vi,vj});
            }
        }
        q.pop();
    }
}

void LeeJ()
{
    q.push({iJ,jJ});
    while(!q.empty())
    {
        int i=q.front().first,j=q.front().second;

        for(int k=0;k<4;k++)
        {
            int vi=i+di[k],vj=j+dj[k];

            if(J[vi][vj]==0)
            {
                J[vi][vj]=J[i][j]+1;
                q.push({vi,vj});
            }
        }
        q.pop();
    }
}

void Afisare()
{
    int vmin=100000,im,jm;

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(R[i][j]==J[i][j] && R[i][j]>0 && R[i][j]<vmin)
            {
                vmin=R[i][j];
                im=i;
                jm=j;
            }

    fout<<vmin<<" "<<im<<" "<<jm;
}

int main()
{
    Citire();
    Bordare();
    LeeR();
    LeeJ();
    Afisare();

    return 0;
}