Cod sursa(job #2380453)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 14 martie 2019 22:11:23
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <cmath>

using namespace std;

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

#define nmax 350

queue < pair<int,int> > coada;

char a[nmax][nmax],sir[nmax];

int v[nmax][nmax],b[nmax][nmax],n,i,j,startJ_x,startJ_y,startR_x,startR_y,m,minim=10000,poz1,poz2;

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

int OK(int i, int j)
{
    if(i<1 || j<1 || j>m || i>n)
        return false;
    if(v[i][j]==-1)
        return false;
    return true;
}

void Lee(int v[nmax][nmax], int startx, int starty)
{
    int i,j,i_urm,j_urm;
    v[startx][starty]=1;
    coada.push(make_pair(startx,starty));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int dir=0;dir<8;dir++)
        {
            i_urm=i+dl[dir];
            j_urm=j+dc[dir];
            if(OK(i_urm,j_urm) && v[i_urm][j_urm]<1)
            {
                v[i_urm][j_urm]=v[i][j]+1;
                coada.push(make_pair(i_urm,j_urm));
            }
        }
    }
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n+1;i++)
    {
        fin.getline(sir,nmax);
        if(i>1)
        {
            j=0;
            for(int k=0;k<strlen(sir);k++)
            {
                j++;
                a[i-1][j]=sir[k];
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='R')
            {
                startR_x=i;
                startR_y=j;
            }
            else if(a[i][j]=='J')
            {
                startJ_x=i;
                startJ_y=j;
            }
            else if(a[i][j]=='X')
            {
                v[i][j]=-1;
                b[i][j]=-1;
            }
        }
    }
    Lee(v,startR_x,startR_y);
    Lee(b,startJ_x,startJ_y);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(v[i][j]==b[i][j])
            {
                if(v[i][j]>0)
                {
                    if(v[i][j]<minim)
                    {
                        minim=v[i][j];
                        poz1=i;
                        poz2=j;
                    }
                }
            }
        }
    }
    fout<<minim<<" "<<poz1<<" "<<poz2;
}