Cod sursa(job #792823)

Utilizator cat_red20Vasile Ioana cat_red20 Data 30 septembrie 2012 17:46:18
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#define MAX 10001
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};
FILE *fin,*fout;

void citire()
{
    char c;
    fin=fopen("rj.in","r");
    fscanf(fin,"%d %d\n",&m,&n);
    for(int i=1;i<=m;i++)
    {
        for(int k=1;k<=n;k++)
        {
            fscanf(fin,"%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;
            }
        }
        fscanf(fin,"%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()
{
    fout=fopen("rj.out","w");
    fprintf(fout,"%d %d %d",r[xsol][ysol],xsol,ysol);
    fclose(fout);
}

int main()
{
    citire();
    coadaj();
    for(int i=1;i<=m;i++)
    coadar();
    printf("\n");
    afisare();
}