#include<stdio.h>
int a[100][100];
char el;
int x[3000],y[3000],x1[3000],y1[3000];
FILE *f,*g;
int main()
{
int d[1000],d1[1000];
int n,m,i,j,jx,jy,rx,ry,min,p,u,gas=0,xv,yv;
f=fopen("rj.in","r");
g=fopen("rj.out","w");
fscanf(f,"%d",&n);
fscanf(f,"%d",&m);
fscanf(f,"%c",&el);
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{
fscanf(f,"%c",&el);
if(el=='x'||el=='X')
{ a[i][j]=-1;
}
else
{ if(el=='r'||el=='R')
{ a[i][j]=1;
rx=i;
ry=j;
}
else
{ if(el=='j'||el=='J')
{
a[i][j]=-2;
jx=i;
jy=j;
}
else
if(el==' ')
{ a[i][j]=0;
}
}
}
}
fscanf(f,"%c",&el); //ca sa treaca la linia urmatoare
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
p=0; //pozitia curenta
u=0; //ultima pozitie (indici in vector)
d[p]=1; // deplasarea (distanta)
d1[p]=1;
int u2=0;
x[0]=rx;y[0]=ry;x1[0]=jx;y1[0]=jy;
while (p<=u&&gas==0) //cat timp mai am elem in coada si nu am gasit pe julieta
{
for(i=0;i<8;i++)
{
xv=x[p]+dx[i];
yv=y[p]+dy[i]; // x vecin si y vecin
if (a[xv][yv]==0&&xv>0&&yv>0) //daca nu e zid
{
u++;
x[u]=xv;
y[u]=yv;
d[u]=d[p]+1; //cati pasi am pus
a[xv][yv]=d[u];
}
}
for(i=0;i<8;i++)
{
xv=x1[p]+dx[i];
yv=y1[p]+dy[i]; // x vecin si y vecin
if ((a[xv][yv]==0||d[u]==a[xv][yv])&&xv>0&&yv>0) //daca nu e zid
{
u2++;
x1[u2]=xv;
y1[u2]=yv;
d1[u2]=d1[p]+1; //cati pasi am pus
if(d1[u2-1]==a[xv][yv])
a[xv][yv]=d1[u2-1];
else
a[xv][yv]=d1[u2];
}
}
p++;
if(u>u2)
min=u2;
else
min=u;
for(i=0;i<min;i++)
for(j=0;j<min;j++)
if(x[i]==x1[j]&&y[i]==y1[j])
{
gas=1;
fprintf(g,"%d %d %d ",a[x[i]][y[i]],x[i],y[i]);}
}
printf("\n");
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
fcloseall();
return 0;
}