Cod sursa(job #145922)

Utilizator Snavenportnespecificat Snavenport Data 29 februarie 2008 18:43:44
Problema Rj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <fstream.h>


#define Nmax 101 
#define Mmax 101

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

struct element 
{
       int x,y;
};

int harta[Nmax][Mmax],n,m;
element romeo,julieta;
int harta2[Nmax][Mmax];

void citire()
{
     f>>n>>m;
     int i,j;
     char c;
     f.get(c);
     for (i=1;i<=n;i++)
     {
         for (j=1;j<=m;j++)
            {
             f.get(c);
             if (c=='J')
               {
                     julieta.x=i;
                     julieta.y=j;
                     harta[i][j]=0;
               }
             else
               if (c=='R')
                 {
                      romeo.x=i;
                      romeo.y=j;
                      harta[i][j]=0;
                 }
               else
                 if (c=='X')
                   harta[i][j]=-1;
                 else
                   if (c==' ')
                      harta[i][j]=0;
             }
         f.get(c);
     }
   for (i=1;i<=n;i++)
     for (j=1;j<=m;j++)
        harta2[i][j]=harta[i][j];
}


element c_r[10000],c_j[10000];
int st=1,dr=0;

element dir[9]={{0,0},{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

void lee(int a[Nmax][Mmax],element inceput,element coada[10000])
{
     int i;
     for (i=0;i<=n;i++)
       {
          a[i][0]=-1;
          a[i][m+1]=-1;
       }
     for (i=0;i<=m;i++)
       {
          a[0][i]=-1;
          a[n+1][i]=-1;
       }
     st=1;
     dr=1;
     coada[1].x=inceput.x;
     coada[1].y=inceput.y;
     a[inceput.x][inceput.y]=1;
     while (st<=dr)
     {
           for (i=1;i<=8;i++)
               if (a[coada[st].x+dir[i].x][coada[st].y+dir[i].y]==0)
                  {
                     dr++;
                     coada[dr].x=coada[st].x+dir[i].x;
                     coada[dr].y=coada[st].y+dir[i].y;
                     a[coada[dr].x][coada[dr].y]=a[coada[st].x][coada[st].y]+1;
                  }
           st++;
     }
}

void drum()
{
     int i,j;
     int min,c_min,l_min;
     for (i=1;i<=n;i++)
       for (j=1;j<=m;j++)
         if (harta[i][j]==harta2[i][j] && harta[i][j]>0)
             {
             min=harta[i][j];
             c_min=j;
             l_min=i;
             j=m;
             i=n;
             }
     int a=l_min,b=c_min;
     for (i=a;i<=n;i++)
       for (j=b;j<=m;j++)
         if (harta[i][j]==harta2[i][j] && harta[i][j]>0)
             if (harta[i][j]<min)
              {
                 min=harta[i][j];
                 l_min=i;
                 c_min=j;
              }
             else
               if (harta[i][j]==min)
                 if (l_min>i)
                  {
                    l_min=i;
                    c_min=j;
                  }
                  else
                    if (c_min>j)
                     {
                       l_min=i;
                       c_min=j;
                     }
     g<<min<<" "<<l_min<<" "<<c_min;                  
}
     
     
main()
{
      int i,j;
      citire();
      lee(harta,romeo,c_r);
      lee(harta2,julieta,c_j);
      drum();
     
}