Cod sursa(job #1178640)

Utilizator AndreiBarbutaAndrei Barbuta AndreiBarbuta Data 26 aprilie 2014 23:21:19
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#define MAX 110
#define ZID -1

using namespace std;

int r[MAX][MAX],ju[MAX][MAX],n,m;
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
char mat[MAX][MAX],s[MAX];
struct coada{
    int x,y;
};coada q[MAX*MAX];

void lee(int mat[][MAX],int xs, int ys){
    int u=1,p=1,x,y,i;
    for(i=0;i<=n+1;i++){
        mat[i][0]=ZID;
        mat[i][m+1]=ZID;
    }
    for(i=0;i<=m+1;i++){
        mat[0][i]=ZID;
        mat[n+1][i]=ZID;
    }
    mat[xs][ys]=1;
    q[p].x=xs;
    q[p].y=ys;
    while(p<=u){
        x=q[p].x;
        y=q[p].y;
        for(i=0;i<=7;i++)
            if(mat[x+dx[i]][y+dy[i]]==0){
                u++;
                q[u].x=x+dx[i];
                q[u].y=y+dy[i];
                mat[x+dx[i]][y+dy[i]]=mat[x][y]+1;
            }
        p++;
    }
}

int main()
{
    freopen("rj.in","r",stdin);
    freopen("rj.out","w",stdout);
    int i,j,rx,ry,jx,jy,MIN=MAX*MAX+1,xf,yf;
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++){
        gets(s);
        for(j=0;j<m;j++)
            switch(s[j]){
                case ' ': r[i][j+1]=0; ju[i][j+1]=0; break;
                case 'X': r[i][j+1]=ZID; ju[i][j+1]=ZID; break;
                case 'R': r[i][j+1]=0; ju[i][j+1]=0; rx=i; ry=j+1; break;
                case 'J': r[i][j+1]=0; ju[i][j+1]=0; jx=i; jy=j+1; break;
            }
    }
    lee(r,rx,ry);
    lee(ju,jx,jy);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(r[i][j]==ju[i][j] and r[i][j]!=0 and r[i][j]!=ZID and MIN>r[i][j]){
                MIN=r[i][j];
                xf=i;
                yf=j;
            }
    printf("%d %d %d\n",MIN,xf,yf);
    return 0;
}