Cod sursa(job #2792150)

Utilizator D4R1U5Sava Darius D4R1U5 Data 1 noiembrie 2021 00:20:37
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("rj.in");
ofstream g("rj.out");

#define NMax 12000

int dx[8]={0, 1, 0, -1, -1, 1, -1, 1};
int dy[8]={1, 0, -1, 0, -1, 1,  1,-1};
long long n,m,xi,yi,xf,yf,xr,yr,xj,yj;
int ju[1005][1005],r[1005][1005];
char c;

queue <int> Q;

void BordareR(int n, int m){
    for (int i=0;i<=m+1;i++)
        r[0][i]=r[n+1][i]=-1;

    for (int i=0;i<=n+1;i++)
        r[i][0]=r[i][m+1]=-1;
}

void BordareJ(int n, int m){
    for (int i=0;i<=m+1;i++)
        ju[0][i]=ju[n+1][i]=-1;

    for (int i=0;i<=n+1;i++)
        ju[i][0]=ju[i][m+1]=-1;
}

static inline void Lee1(int xi, int yi){
    queue<pair<int,int>> Q;
    int x,y,xx,yy;
    Q.push(make_pair(xi,yi));
    r[xi][yi]=1;
    while (!Q.empty()){
        x=Q.front().first;
        y=Q.front().second;
        for (int i=0;i<8;i++){
            xx=x+dx[i];
            yy=y+dy[i];
            if (r[xx][yy]==0){
                    Q.push(make_pair(xx,yy));
                    r[xx][yy]=r[x][y]+1;
            }
        }
        Q.pop();
    }
}

static inline void Lee2(int xi, int yi){
    queue<pair<int,int>> Q;
    int x,y,xx,yy;
    Q.push(make_pair(xi,yi));
    ju[xi][yi]=1;
    while (!Q.empty()){
        x=Q.front().first;
        y=Q.front().second;
        for (int i=0;i<8;i++){
            xx=x+dx[i];
            yy=y+dy[i];
            if (ju[xx][yy]==0){
                    Q.push(make_pair(xx,yy));
                    ju[xx][yy]=ju[x][y]+1;
            }
        }
        Q.pop();
    }
}

void afisare(){
    int  t_minim = NMax;
    int Minx=-1, Miny=-1;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            if (r[i][j]==ju[i][j] && r[i][j]<t_minim && r[i][j]!=0 && r[i][j]!=-1){
                t_minim=r[i][j];
                Minx=i;
                Miny=j;
            }
        }
    }
    g<<t_minim<<" "<<Minx<<" "<<Miny<<'\n';

}

int main()
{
     // ios_base :: sync_with_stdio(false);
     // cin.tie(nullptr);
     // f.tie(0);

    f>>n>>m;
    f.get();
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            f.get(c);
            if (c=='X'){
                r[i][j]=ju[i][j]=-1;
            }
            if (c=='R'){
                xr=i;
                yr=j;
                r[i][j]=ju[i][j]=0;
            }
            if (c=='J'){
                xj=i;
                yj=j;
                r[i][j]=ju[i][j]=0;

            }
            if (c==' '){
                r[i][j]=ju[i][j]=0;
            }
        }
        f.get();
    }


    BordareR(n,m);
    BordareJ(n,m);

    Lee1(xr,yr);
    Lee2(xj,yj);
/*
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            g<<r[i][j]<<" ";
        }
        g<<'\n';
    }
*/

    afisare();
    return 0;
}