Cod sursa(job #891014)

Utilizator ramy30razvan ramy30 Data 25 februarie 2013 13:09:53
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.54 kb
/*#include <iostream>
#include<fstream>

using namespace std;

int n,mR[100][100],mJ[100][100],m, xr,yr,xj,yj,x[10000],y[10000];

const int dx[]={-1,-1,0,1,1,1,0,-1};
const int dy[]={0,1,1,1,0,-1,-1,-1};

int bune(int ii,int jj)
{
    return((ii>=0)&&(ii<n)&&(jj>=0)&&(jj<m));
}




void leec(int mat[100][100], int first, int last)
{
    int ii,jj,k,pas;

    while(first<=last)
    {
        for(k=0;k<8;k++)
        {
            ii=x[first]+dx[k];
            jj=y[first]+dy[k];
            pas=mat[x[first]][y[first]];
            if(bune(ii,jj)==1)
                if((mat[ii][jj]==0)||(mat[ii][jj]>pas+1))
                {
                    pas=pas+1;
                    mat[ii][jj]=pas;
                    last=last+1;
                    x[last]=ii;
                    y[last]=jj;
                }
        }
        first=first+1;
    }
}

int main()

{
    ifstream in("rj.in");
    char sir[101];
    in>>n>>m;
    in.get();
    int i,j,first,last,xf,yf,minim;
    for(i=0;i<n;i++)
    {
        in.getline (sir,101,'\n');
        for(j=0;j<m;j++)
        {
            if(sir[j]=='R'){mR[i][j]=1; xr=i;yr=j;}
            if(sir[j]=='J'){mJ[i][j]=1; xj=i; yj=j;}
            if(sir[j]=='X'){mR[i][j]=1; mJ[i][j]=1;}

        }
    }
        in.close();
        first=0; last=0; x[0]=xr; y[0]=yr; leec(mR,first,last);
        first=0; last=0; x[0]=xj; y[0]=yj; leec(mJ,first,last);

        minim=100*100;
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
              if(mR[i][j]==mJ[i][j])
                if(mR[i][j]>1)
                  if(mR[i][j]<minim)
                    {
                        minim=mR[i][j];
                        xf=i;
                        yf=j;

                    }
        ofstream out("rj.out");
        out<<minim<<" "<<xf+1<<" "<<yf+1;

}
*/

#include <fstream>

using namespace std;

ofstream out("rj.out");

const int dx[]={-1,-1,0,1,1,1,0,-1};
const int dy[]={0,1,1,1,0,-1,-1,-1};

int n,m,xr,yr,xj,yj,mR[100][100],mJ[100][100];

int x[10000], y[10000];

int first, last, pas;

void citire()
{
    int i,j;
    char sir[101];
    ifstream in("rj.in");
    in>>n>>m;
    in.get();
    for(i=0;i<n;i++)
    {
        in.getline(sir,101,'\n');
        for(j=0;j<m;j++)
        {
            if(sir[j]=='R'){ xr=i; yr=j; mR[i][j]=1;}
            if(sir[j]=='J'){ xj=i; yj=j; mJ[i][j]=1;}
            if(sir[j]=='X'){ mR[i][j]=1; mJ[i][j]=1;}
        }
    }
    in.close();
}
int bune(int ii,int jj)
{
    return((ii>=0)&&(ii<n)&&(jj>=0)&&(jj<m));
}
void leecR()
{
    int ii,jj,k,pas;
    while(first<=last)
    {
    for(k=0;k<8;k++)
    {
        ii=x[first]+dx[k];
        jj=y[first]+dy[k];
        if(bune(ii,jj))
        {
            pas=mR[x[first]][y[first]];
            if( (mR[ii][jj]==0) || (mR[ii][jj]>pas+1) )
            {
                pas=pas+1;
                mR[ii][jj]=pas;
                last++;
                x[last]=ii;
                y[last]=jj;
            }
        }
    }
    first++;
    }
}

void leecJ()
{
    int ii,jj,k;
    while(first<=last)
    {
    for(k=0;k<8;k++)
    {
        ii=x[first]+dx[k];
        jj=y[first]+dy[k];
        if(bune(ii,jj))
        {
            pas=mJ[x[first]][y[first]];
            if( (mJ[ii][jj]==0) ||(mJ[ii][jj]>pas+1) )
            {
                pas=pas+1;
                mJ[ii][jj]=pas;
                last++;
                x[last]=ii;
                y[last]=jj;
            }
        }
    }
    first++;
    }
}

int main()
{
    int i,j,min,xf,yf;

    citire();
    x[0]=xr;
    y[0]=yr;
    first=0;
    last=0;
    leecR();

    x[0]=xj;
    y[0]=yj;
    first=0;
    last=0;
    leecJ();

    /*
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
                if(mat[i][j]>max) { max=mat[i][j]; xretinut=i; yretinut=j; }
    gasit=1;
    for(i=0;i<n&&gasit;i++)
        for(j=0;j<m&&gasit;j++)
            if(mat[i][j]==min){gasit=0; xretinut=i; yretinut=j;}
    */

    min=100*100;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if (mR[i][j]>1)
                if(mR[i][j]==mJ[i][j])
                   if(mR[i][j]<min)
                    {
                        min=mR[i][j];
                        xf=i;
                        yf=j;
                    }
    /*
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
            out<<mJ[i][j]<<" ";
        out<<endl;
    }
    */
    out<<min<<" "<<xf+1<<" "<<yf+1;
    out.close();
    return 0;
}