Cod sursa(job #2497220)

Utilizator sygAndreiIonitaIonita Andrei sygAndreiIonita Data 22 noiembrie 2019 11:27:32
Problema Rj Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <queue>

using namespace std;

queue < pair <int,int> > q;
int rom[101][101],jul[101][101];
bool v[101][101];
bool da[101][101],da1[101][101];
pair <int,int> p;

int lin[8] = {-1, 0, 1, 0, 1, 1, -1, -1};
int col[8] = {0, 1, 0, -1, 1, -1, 1, -1};

int n,m;

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

void lee (int i,int j,bool ok)
{
    q.push({i,j});
    if (ok==0)
    rom[i][j]=1;
    else
    jul[i][j]=1;
    int ii,jj,i2,j2;
    while (!q.empty())
    {
        p=q.front();
        q.pop();
        ii=p.first;
        jj=p.second;
        for (int d=0; d<8; d++)
        {
            i2=ii+lin[d];
            j2=jj+col[d];
            if (j2>0&&i2>0&&i2<=n&&j2<=m&&v[i2][j2]==0)
            {
              if (ok==0&&da[i2][j2]==0)
                da[i2][j2]=1,rom[i2][j2]=rom[ii][jj]+1,q.push({i2,j2});
              else if (ok==1&&da1[i2][j2]==0)
                da1[i2][j2]=1,jul[i2][j2]=jul[ii][jj]+1,q.push({i2,j2});
            }
        }
    }
}

int main()
{
    int i,j,ri,rj,ji,jj1,cnt=0;
    char c;
    in>>n>>m;
    in.get(c);
    for (i=1; i<=n; i++)
    {
        cnt=0;
        while (in.get(c)&&c!='\n')
        {
            cnt++;
            if (c=='X')
                v[i][cnt]=1;
            else
              v[i][cnt]=0;
            if (c=='R')
                ri=i,rj=cnt;
            else if (c=='J')
                ji=i,jj1=cnt;
        }
        if (cnt<m)
            for (int k=cnt+1; k<=m; k++)
                v[i][k]=0;
    }
    lee(ri,rj,0);
    lee(ji,jj1,1);
    int min1=1000000000,lfin=0,cfin=1000000000;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
        {
            if (v[i][j]==0&&rom[i][j]==jul[i][j]&&rom[i][j]!=0&&jul[i][j]!=0)
            {
                if (rom[i][j]<min1)
                    min1=rom[i][j],lfin=i,cfin=j;
                else if (rom[i][j]==min1&&j<cfin)
                    lfin=i,cfin=j;
            }
        }
    out<<min1<<" "<<lfin<<" "<<cfin;
    return 0;
}