Cod sursa(job #1735693)

Utilizator liviu23Liviu Andrei liviu23 Data 30 iulie 2016 17:40:04
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <queue>
#define f first
#define s second
#define DIM 105
using namespace std;

char s[DIM][DIM];
int n,m,rm[DIM][DIM],jl[DIM][DIM];

bool isOK(pair<int,int> p) {
    return (p.f>=1&&p.f<=n&&p.s>=1&&p.s<=m&&s[p.f][p.s]!='X');
}

void bfs(int mt[DIM][DIM],pair<int,int> p) {
    pair<int,int> pN,d[]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
    queue<pair<int,int> > q;
    q.push(p);
    mt[p.f][p.s]=1;
    while(!q.empty()) {
        p=q.front();
        q.pop();
        for(int i=0;i<4;i++) {
            pN={p.f+d[i].f,p.s+d[i].s};
            if(isOK(pN)&&!mt[pN.f][pN.s]) {
                q.push(pN);
                mt[pN.f][pN.s]=mt[p.f][p.s]+1;
            }
        }
    }
}

int main()
{
    ifstream fin("rj.in");
    ofstream fout("rj.out");
    fin>>n>>m;
    fin.getline(s[0],DIM);
    for(int i=1;i<=n;i++)
        fin.getline(s[i]+1,DIM);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++) {
        if(s[i][j]=='R') {
            bfs(rm,{i,j});
        }
        else if(s[i][j]=='J')
            bfs(jl,{i,j});
    }
    int mn=100000;
    pair<int,int> p;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++) {
        if(rm[i][j]&&rm[i][j]==jl[i][j]&&rm[i][j]-1<mn) {
            p={i,j};
            mn=rm[i][j]-1;
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++)
            fout<<rm[i][j]<<" ";
        fout<<'\n';
    }
    fout<<mn<<" "<<p.f<<" "<<p.s;
    return 0;
}