Cod sursa(job #2638519)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 28 iulie 2020 15:37:48
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>

using namespace std;

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

const int NMAX=110, dl[]={-1,-1,0,1,1,1,0,-1},dc[]={0,1,1,1,0,-1,-1,-1};
int n,m,harta[NMAX][NMAX];
int matR[NMAX][NMAX],matJ[NMAX][NMAX];
char s[NMAX];
struct pozitie{
    int x,y;
}pozR,pozJ,coada[NMAX*NMAX*10],pozMn;

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')
                harta[i][j+1]=-1;
            if (s[j]=='R'){
                pozR.x=i;
                pozR.y=j+1;
            }
            if (s[j]=='J'){
                pozJ.x=i;
                pozJ.y=j+1;
            }
        }
    }
}
bool ok(pozitie a)
{
    return (a.x>=1 && a.x<=n && a.y>=1 && a.y<=m);
}
void lee(pozitie a, int mat[NMAX][NMAX])
{
    for (int i=1; i<=n; i++){
        for (int j=1; j<=m; j++){
            mat[i][j]=harta[i][j];
        }
    }
    mat[a.x][a.y]=1;
    int prim,ultim;
    prim=ultim=1;
    coada[prim]=a;
    pozitie container,vecin;
    while (prim<=ultim){
        container=coada[prim];
        prim++;
        for (int k=0; k<8; k++){
            vecin.x=container.x+dl[k];
            vecin.y=container.y+dc[k];
            if (ok(vecin)){
                if (mat[vecin.x][vecin.y]==0){
                    mat[vecin.x][vecin.y]=mat[container.x][container.y]+1;
                    ultim++;
                    coada[ultim]=vecin;
                }
            }
        }
    }
}
void rezolvare()
{
    lee(pozR,matR);
    lee(pozJ,matJ);
    int mn=100000000;
    for (int i=1; i<=n; i++){
        for (int j=1; j<=m; j++){
            if (matR[i][j]==matJ[i][j] && matR[i][j]>0){
                if (matR[i][j]<mn){
                    mn=matR[i][j];
                    pozMn.x=i;
                    pozMn.y=j;
                }
            }
        }
    }
}
void afisare()
{
    fout<<matR[pozMn.x][pozMn.y]<<' '<<pozMn.x<<' '<<pozMn.y;
}
int main()
{
    citire();
    fin.close();
    rezolvare();
    afisare();
    fout.close();
    return 0;
}