Cod sursa(job #1117191)

Utilizator andreiulianAndrei andreiulian Data 23 februarie 2014 11:21:32
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<cstdio>
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int dl[]={0,-1,-1,0,1,1,1,0,-1}, dc[]={0,0,1,1,1,0,-1,-1,-1};
int main()
{
    FILE *out;
    int N,M,i,j,l1,c1,l2,c2,p,u,ok,tmin=100000,d;
    struct punct {int l,c;}v[500];
    char m[101][101],*q;
    ifstream in("rj.in");
    out=fopen("rj.out","w");
    in>>N>>M;
    in.getline(m[0],10);
    for(i=1;i<=N;i++)
        {
            in.getline(m[i]+1,100);
            m[i][0]=m[i][M+1]='X';
            q=strchr(m[i],'R');
            if(q)
            {
                l1=i;
                c1=q-m[i];
            }
            q=strchr(m[i],'J');
            if(q)
            {
                l2=i;
                c2=q-m[i];
            }
        }
    //incepe lee
    for(i=0;i<=M+1;i++)
        m[0][i]=m[N+1][i]='X';
    int lc,cc,lv,cv;
    p=u=1;
    v[1].l=l1; v[1].c=c1; ok=0; m[l1][c1]=1;
    while(p<=u || ok==0)
    {
        lc=v[p].l;
        cc=v[p].c;
        if(lc==l2 && cc==c2)
        {
            ok=1;
            tmin=(m[lc][cc]+1)/2;
        }
        else
        {
            for(d=1;d<=8;d++)
            {
                lv=lc+dl[d];
                cv=cc+dc[d];
                if(m[lv][cv]!='X')
                    if(m[lc][cc]+1<m[lv][cv] || m[lv][cv]==' ')
                {u++;
                m[lv][cv]=m[lc][cc]+1;
                v[u].l=lv;
                v[u].c=cv;}
            }
        }
        p++;
    }
    int lmin=100, cmin=100;
    for(i=1;i<=N;i++)
        for(j=1;j<=M;j++)
        if(m[i][j]==tmin)
        {
            if(i<lmin) {lmin=i; cmin=j;}
            else
                if(i==lmin && j<cmin) cmin=j;
        }
    fprintf(out,"%i %i %i\n",tmin,lmin,cmin);
}