Cod sursa(job #884175)

Utilizator calin07Calin Claudiu calin07 Data 20 februarie 2013 18:49:56
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.16 kb
#include <fstream>
using namespace std;
const int dy[]={0,1,0,-1};
const int dx[]={-1,0,1,0};
int xR,yR,xJ,yJ;
int turbofin=7991;
int i,j,l,k;
int mat[102][102];
bool mas[102][102];
int cazuri[2];

void leeR(int ii,int jj,int c)
{
int kp,a,b;
   for(kp=0;kp<4;kp++)
    {
a=ii+dx[kp];
b=jj+dy[kp];
       {
        if((a==xJ)&&(b==yJ)&&c/2+1<turbofin)
        {
            turbofin=(c*((-1)))/2+1;
        }
        else if(((mat[a][b]==0)||(mat[a][b]<c-1))&&mas[a][b]!=1)
        {
           mat[a][b]=c-1;
            leeR(a,b,c-1);
        }

       }
    }

}
bool JulietJustCheckAround(int ii,int jj,int bh)
{

int kp,a,cs=0,b;
bh=(bh*(-1))+1;
    for(kp=0;kp<4;kp++)
    {
a=ii+dx[kp];
b=jj+dy[kp];


        if(mat[a][b]==bh)
        {
            cs++;
        }

    }
    if(cs==1)
        return 1;
    return 0;
}
void leeJ(int ii,int jj,int c)
{
int kp,a,b;

    if(c<turbofin)
    {
   for(kp=0;kp<4;kp++)
    {
a=ii+dx[kp];
b=jj+dy[kp];
        if(   ( ( mat[a][b]==0 )  ||  ( mat[a][b]<(c*(-1)) )   )&&mas[a][b]!=1)
        {

            mat[a][b]=c+1;
            leeJ(a,b,c+1);
        }

    }
    }
}
int main()
{
    cazuri[0]=7991;
cazuri[1]=7991;
 ifstream g("rj.in");
char v[101];
g>>k>>l;
for(i=0;i<=k;i++)
    {
        g.getline(v,l+1);
        for(j=1;j<=l;j++)
       {
        {
        if(v[j-1]=='X')mas[i][j]=1;
        else if(v[j-1]==' ')mat[i][j]=0;
        else if(v[j-1]=='R')
        {
            mas[i][j]=1;
            xR=i;
            yR=j;
        }
        else if(v[j-1]=='J')
        {
            mas[i][j]=1;
            xJ=i;
            yJ=j;
        }
        }

       }
    }
//bordizification
{
    for(i=0;i<=(l<k?k:l);i++)
{
        mas[i][0]=1;
        mas[i][k+1]=1;
        mas[0][i]=1;
        mas[l+1][i]=1;
}}
leeR(xR,yR,0);
leeJ(xJ,yJ,0);
for(i=1;i<=k;i++)
    for(j=1;j<=l;j++)
        if(mat[i][j]==turbofin)
            if(JulietJustCheckAround(i,j,turbofin)==1)
    {

//In cazul existentei mai multor solutii se va afisa solutia in care linia punctului de intalnire este minima.
//Daca si asa exista mai multe solutii, se va afisa cea in care coloana punctului de intalnire este minima.
    if(cazuri[0]>i)
    {
        cazuri[0]=i;
        cazuri[1]=j;
    }
    else if(cazuri[0]==i)
        if(cazuri[1]>j)
        {

        cazuri[0]=i;
        cazuri[1]=j;
        }
    }
    /*
if(IGLOBAL>1)
{
    mat[0][0]=26267;
    mat[0][1]=0;
for(i=0;i<IGLOBAL;i++)
{
 if(cazuri[i][0]<mat[0][0])
 {
     mat[0][0]=cazuri[i][0];
     mat[0][1]++;
     mat[1][0]=cazuri[i][0];
     mat[1][1]=cazuri[i][1];
 }
}
if(mat[0][1]>1)
{
 mat[0][2]=26267;
 for(i=0;i<IGLOBAL;i++)
        if(cazuri[i][0]==mat[0][0])
 {
     if(cazuri[i][1]<mat[0][2])
     {
          mat[0][2]=cazuri[i][1];
          mat[1][0]=cazuri[i][0];
          mat[1][1]=cazuri[i][1];
     }
 }

}
cazuri[0][0]=mat[1][0];
cazuri[0][1]=mat[1][1];
}*/
ofstream o("rj.out");

/*for(i=0;i<=k+1;i++)
{
    for(j=0;j<=l+1;j++)
    o<<mat[i][j]<<" ";
    o<<"\n";
}*/

o<<turbofin<<" "<<cazuri[0]<<" "<<cazuri[1];
return 0;
}