Cod sursa(job #1534018)

Utilizator ank.00Anca Prodan ank.00 Data 23 noiembrie 2015 10:37:11
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include <fstream>
#include <cstring>
using namespace std;
struct poz
{
    int l,c;
};
poz coadar[20000],coadaj[20000];
int rom[102][102],jul[102][102];
int dx[]={0,-1,-1,0,1,1,1,0,-1};
int dy[]={0,0,1,1,1,0,-1,-1,-1};
int incr,incj,sfr,sfj;
int lin,col,xr,yr,xj,yj;
int tmin=10000;
int n,m;
ifstream f("rj.in");
ofstream g("rj.out");
void citire()
{
    char s[102];
    f>>n>>m;
    f.get();
    for(int i=1;i<=n;i++)
       {
            f.getline(s,102);
            for(int j=0;j<=strlen(s)-1;j++)
            if(s[j]=='R')
            {
                rom[i][j+1]=1;
                xr=i;
                yr=j+1;
                jul[i][j+1]=-1;
            }
            else
                if(s[j]=='J')
                {
                rom[i][j+1]=-1;
                jul[i][j+1]=1;
                xj=i;
                yj=j+1;
                }
                else
                    if(s[j]=='X')
                    rom[i][j+1]=jul[i][j+1]=-1;
                    else
                    rom[i][j+1]=jul[i][j+1]=0;
        }
}
void bordare()
{
    for(int i=0;i<=n+1;i++)
        rom[i][0]=jul[i][0]=rom[i][m+1]=jul[i][m+1]=-1;
    for(int i=0;i<=m+1;i++)
        rom[0][i]=jul[0][i]=rom[n+1][i]=jul[n+1][i]=-1;
}
void leer(int rom[102][102], int &inc, int &sf)
{
    int k,nr=1;
    coadar[sf].l=xr;
    coadar[sf].c=yr;
    while(inc<=sf)
    {
        for(k=1;k<=8;k++)
        {
            lin=coadar[inc].l+dx[k];
            col=coadar[inc].c+dy[k];
            if(rom[lin][col]==0||rom[lin][col]>nr)
            {
                sf++;
                coadar[sf].l=lin;
                coadar[sf].c=col;
                rom[lin][col]=rom[coadar[inc].l][coadar[inc].c]+1;
            }
        }
        nr=rom[coadar[sf].l][coadar[sf].c];
        inc++;
    }
}
void leej(int jul[102][102], int &inc, int &sf)
{
    int k,nr=1;
    coadaj[sf].l=xj;
    coadaj[sf].c=yj;
    while(inc<=sf)
    {
        for(k=1;k<=8;k++)
        {
            lin=coadaj[inc].l+dx[k];
            col=coadaj[inc].c+dy[k];
            if(jul[lin][col]==0||jul[lin][col]>nr)
            {
                sf++;
                coadaj[sf].l=lin;
                coadaj[sf].c=col;
                jul[lin][col]=jul[coadaj[inc].l][coadaj[inc].c]+1;
            }
        }
        nr=jul[coadaj[sf].l][coadaj[sf].c];
        inc++;
    }
}
void minim(int &tmin, int &lin, int &col)
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(rom[i][j]>0&&jul[i][j]>0&&(rom[i][j]==jul[i][j]))
                if(rom[i][j]<tmin)
                {
                    tmin=rom[i][j];
                    lin=i;
                    col=j;
                }
}
void afisare()
{
    int i,j;
    g<<tmin<<" "<<lin<<" "<<col;
    /*g<<'\n';
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            g<<rom[i][j]<<" ";
        g<<'\n';
    }
    g<<'\n';
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            g<<jul[i][j]<<" ";
        g<<'\n';
    }*/
}
int main()
{
    citire();
    bordare();
    incr=sfr=incj=sfj=1;
    leer(rom,incr,sfr);
    leej(jul,incj,sfj);
    minim(tmin,lin,col);
    afisare();
}