Cod sursa(job #518915)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 3 ianuarie 2011 14:59:58
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include<cstdio>
using namespace std;
struct Pozitie{int x,y,d;};
Pozitie c[10002];
int a[101][101],b[101][101],inc=1,sf,n,m;

inline void PuneInCoada1(int x1,int y1,int d1)
{
     c[++sf].x=x1;
     c[sf].y=y1;
     c[sf].d=d1;
     a[x1][y1]=d1;
}

inline void PuneInCoada2(int x1,int y1,int d1)
{
     c[++sf].x=x1;
     c[sf].y=y1;
     c[sf].d=d1;
     b[x1][y1]=d1;
}

int main()
{
    int i,j,x1,y1,d1,xj=0,yj=0,xr=0,yr=0,gasit=0,min=10001,xmin=0,ymin=0;
    char s[102];
    freopen("rj.in", "r", stdin);
    scanf("%d",&n);
    scanf("%d",&m);
    gets(s);
    for(i=1;i<=n;i++)
    {
                     gets(s);
                     for(j=1;j<=m;j++)
                     {
                         if(s[j-1]=='X') a[i][j]=-1;
                         else if(s[j-1]=='J') {a[i][j]=-2; xj=i; yj=j;}
                              else if(s[j-1]=='R') {a[i][j]=-3; xr=i; yr=j;}
                                   else a[i][j]=0;
                         
                     }
    }
    for(i=1;i<=n;i++) a[i][0]=a[i][m+1]=-1;
    for(i=1;i<=m;i++) a[0][i]=a[n+1][i]=-1;
    for(i=0;i<=n;i++)
                     for(j=0;j<=m;j++)
                                      b[i][j]=a[i][j];
    c[++sf].x=xj;
    c[sf].y=yj;
    c[sf].d=1;
    while((sf-inc+1)>0)
    {
        x1=c[inc].x;
        y1=c[inc].y;
        d1=c[inc].d+1;
        inc++;
        if(a[x1+1][y1]==0) PuneInCoada1(x1+1,y1,d1);
        if(a[x1+1][y1+1]==0) PuneInCoada1(x1+1,y1+1,d1);
        if(a[x1+1][y1-1]==0) PuneInCoada1(x1+1,y1-1,d1);
        if(a[x1][y1+1]==0) PuneInCoada1(x1,y1+1,d1);
        if(a[x1][y1-1]==0) PuneInCoada1(x1,y1-1,d1);
        if(a[x1-1][y1-1]==0) PuneInCoada1(x1-1,y1-1,d1);
        if(a[x1-1][y1]==0) PuneInCoada1(x1-1,y1,d1);
        if(a[x1-1][y1+1]==0) PuneInCoada1(x1-1,y1+1,d1);
    }
    inc=1;
    sf=0;
    c[++sf].x=xr;
    c[sf].y=yr;
    c[sf].d=1;
    while((sf-inc+1)>0)
    {
        x1=c[inc].x;
        y1=c[inc].y;
        d1=c[inc].d+1;
        inc++;
        if(b[x1+1][y1]==0) PuneInCoada2(x1+1,y1,d1);
        if(b[x1+1][y1+1]==0) PuneInCoada2(x1+1,y1+1,d1);
        if(b[x1+1][y1-1]==0) PuneInCoada2(x1+1,y1-1,d1);
        if(b[x1][y1+1]==0) PuneInCoada2(x1,y1+1,d1);
        if(b[x1][y1-1]==0) PuneInCoada2(x1,y1-1,d1);
        if(b[x1-1][y1-1]==0) PuneInCoada2(x1-1,y1-1,d1);
        if(b[x1-1][y1]==0) PuneInCoada2(x1-1,y1,d1);
        if(b[x1-1][y1+1]==0) PuneInCoada2(x1-1,y1+1,d1);
    }
    freopen("rj.out", "w", stdout);
    for(i=1;i<=n;i++)
    {
       for(j=1;j<=m;j++)
       {
           if((a[i][j]==b[i][j]) && a[i][j]<min && a[i][j]>0)
           {
               min=a[i][j];
               xmin=i;
               ymin=j;
           }
       }
    }
    printf("%d",min );
    printf(" %d",xmin );
    printf(" %d",ymin );
    printf("\n");
    return 0;
}