Cod sursa(job #796752)

Utilizator supermitelArdelean Razvan Mitel supermitel Data 12 octombrie 2012 14:39:30
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>
#define MAX 101

int r[102][102], j[102][102],c[2][MAX],m,n,xr,yr,xj,yj,xsol,ysol;
int dx[8]={1,0,-1,-1,-1,0,1,1},dy[8]={-1,-1,-1,0,1,1,0,1};

void citire()
{
    char c;
    freopen("rj.in","r",stdin);
    scanf("%d %d\n",&m,&n);
    for(int i=1;i<=m;i++)
    {
        for(int k=1;k<=n;k++)
        {
            scanf("%c",&c);
            if(c=='X')
            {
                r[i][k]=-1;
                j[i][k]=-1;
            }
            else
            if(c==' ')
            {
                r[i][k]=MAX;
                j[i][k]=MAX;
            }
            else
            if(c=='R')
            {
                xr=i; yr=k;
                r[i][k]=1;
                j[i][k]=MAX;
            }
            else
            if(c=='J')
            {
                xj=i; yj=k;
                r[i][k]=MAX;
                j[i][k]=1;
            }
        }
        scanf("%c",&c);
    }
}

void coadaj()
{
    int l,cc,p,u;
    p=u=1;
    c[0][p]=xj;
    c[1][p]=yj;
    while(p<=u)
    {
        l=c[0][p];
        cc=c[1][p];
        for(int i=0;i<=7;i++)
        {
            if(j[l+dx[i]][cc+dy[i]]>j[l][cc]+1)
            {
                u++;
                c[0][u]=l+dx[i];
                c[1][u]=cc+dy[i];
                j[l+dx[i]][cc+dy[i]]=j[l][cc]+1;
            }
        }
        p++;
    }
}

void coadar()
{
    int p=1,u=1,l,cc;
    c[0][p]=xr;
    c[1][p]=yr;
    while(p<=u)
    {
        l=c[0][p];
        cc=c[1][p];
        for(int i=0;i<=7;i++)
        {
            if(r[l+dx[i]][cc+dy[i]]>r[l][cc]+1)
            {
                r[l+dx[i]][cc+dy[i]]=r[l][cc]+1;
                u++;
                c[0][u]=l+dx[i];
                c[1][u]=cc+dy[i];
                if(j[l+dx[i]][cc+dy[i]]==r[l+dx[i]][cc+dy[i]])
                {
                    xsol=c[0][u];
                    ysol=c[1][u];
                    return ;
                }
            }
        }
        p++;
    }
}

void afisare()
{
    freopen("rj.out","w",stdout);
    printf("%d %d %d",r[xsol][ysol],xsol,ysol);
}

int main()
{
    citire();
    coadaj();
    coadar();
    printf("\n");
    afisare();
}