Cod sursa(job #1304154)

Utilizator nacrocRadu C nacroc Data 28 decembrie 2014 18:36:31
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include<stdio.h>
#define NMAX 105
#define inf 1<<30

using namespace std;

struct poz{
    int x,y;
};

int r[NMAX][NMAX],j[NMAX][NMAX];
poz q[NMAX*NMAX];
char s[NMAX];

void bordare(int n,int m){
    for(int i=0;i<=m+1;++i)
        r[i][0]=j[i][0]=r[i][n+1]=j[i][n+1]=-1;
    for(int i=0;i<=n+1;++i)
        r[0][i]=j[0][i]=r[m+1][i]=j[m+1][i]=-1;
}

void lee(int x,int y,int mat[NMAX][NMAX]){
    int st,fin;
    int dl[]={-1,-1,0,1,1,1,0,-1},dc[]={0,1,1,1,0,-1,-1,-1};
    poz p;
    st=fin=1;
    while(st<=fin){
        p.x=q[st].x;
        p.y=q[st].y;
        ++st;
        for(int k=0;k<=7;++k)
            if(mat[p.x+dl[k]][p.y+dc[k]]==0){
                mat[p.x+dl[k]][p.y+dc[k]]=mat[p.x][p.y]+1;
                ++fin;
                q[fin].x=p.x+dl[k];
                q[fin].y=p.y+dc[k];
            }
    }
}

int main(){
    freopen("rj.in","r",stdin);
    freopen("rj.out","w",stdout);
    int n,m,min=inf,minx,miny;
    char c;
    poz pr,pj;
    scanf("%d %d%c",&m,&n,&c);
    bordare(n,m);
    for(int i=1;i<=m;++i){
        gets(s);
        for(int k=0;k<n;++k){
            if(s[k]==' ') r[i][k+1]=j[i][k+1]=0;
            else if(s[k]=='X') r[i][k+1]=j[i][k+1]=-1;
            else if(s[k]=='R') {
                    r[i][k+1]=j[i][k+1]=0;
                    pr.x=i;
                    pr.y=k+1;
                }
            else if(s[k]=='J') {
                r[i][k+1]=j[i][k+1]=0;
                pj.x=i;
                pj.y=k+1;
            }
            else r[i][k+1]=j[i][k+1]=0;
        }
    }
    q[1].x=pr.x;
    q[1].y=pr.y;
    r[pr.x][pr.y]=1;
    lee(pr.x,pr.y,r);
    q[1].x=pj.x;
    q[1].y=pj.y;
    j[pj.x][pj.y]=1;
    lee(pj.x,pj.y,j);
    for(int i=m;i>=1;--i)
        for(int k=n;k>=1;--k)
            if(r[i][k]==j[i][k] && r[i][k]>0 && r[i][k]<min){
                min=r[i][k];
                minx=i;
                miny=k;
            }
    printf("%d %d %d\n",min,minx,miny);
    return 0;
}