Cod sursa(job #890969)

Utilizator razvanb87Razvan Buhaianu razvanb87 Data 25 februarie 2013 12:55:50
Problema Rj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <fstream>
#include <iostream>


using namespace std;
ofstream fout("rj.out");

int n,m,matR[100][100],matJ[100][100],xr,yr,xj,yj,x[100000],y[100000];

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


void citire()
{
    int i,j;
    char sir[101];
    ifstream fin("rj.in");
    fin>>n>>m;
    fin.get();
    for(i=0;i<n;i++)
    {
        fin.getline(sir,100,'\n');
        for(j=0;j<m;j++)
        {
            if(sir[j]=='R')
            {
                matR[i][j]=1;
                xr=i;
                yr=j;
            }
            if(sir[j]=='J')
            {
                matJ[i][j]=1;
                xj=i;
                yj=j;
            }
            if(sir[j]=='X')
            {
                matR[i][j]=1;
                matJ[i][j]=1;
            }
        }
    }
    fin.close();
}

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

void leec(int mat[][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()
{
    citire();
    int first,last,minim,xf,yf,i,j;
    first=0;
    last=0;
    x[0]=xr;
    y[0]=yr;
    leec(matR,first,last);

    first=0;
    last=0;
    x[0]=xj;
    y[0]=yj;
    leec(matJ,first,last);




    minim=10000;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if(matR[i][j]==matJ[i][j])
                if(matR[i][j]>1)
                    if(matR[i][j]<minim)
                    {
                        minim=matR[i][j];
                        xf=i;
                        yf=j;
                    }

    fout<<minim<<" "<<xf+1<<" "<<yf+1;
    fout.close();
    return 0;
}