Cod sursa(job #100809)
#include<stdio.h>
int a1[102][102],a2[102][102],i,j,n,m,u,p,u1,p1,ok,tmin,x,y;
int main()
{
typedef struct { int l,c;} COADA;
COADA cd1[10000],cd2[10000],x1,x2;
char ch[100],c2; int t[3];
t[1]=1,t[2]=-1;
FILE*f=fopen("rj.in","r");
FILE*g=fopen("rj.out","w");
fscanf(f,"%d%d%c",&n,&m,&c2);
for (i=1;i<=n;i++)
{fgets (ch,m+2,f);
for(j=0;j<m;j++)
switch(ch[j])
{ case 'X': a1[i][j+1]=a2[i][j+1]=-1;break;
case 'R': a1[i][j+1]=a2[i][j+1]=1;x1.l=i;x1.c=j+1;break;
case 'J': a1[i][j+1]=a2[i][j+1]=1;x2.l=i;x2.c=j+1;break;
default: break; }}
for (i=1;i<=n;i++)
{a1[i][0]=a1[i][m+1]=a1[0][0]=a1[n+1][0]=-1;
a2[i][0]=a2[i][m+1]=a2[0][0]=a2[n+1][0]=-1;}
for (i=1;i<=m+1;i++)
{ a1[0][i]=a1[n+1][i]=-1;
a2[0][i]=a2[n+1][i]=-1; }
u1=p1=u=p=1;cd1[p]=x1;cd2[p1]=x2;
ok=0;
while (p<=u && p1<=u1)
{ x1=cd1[p++]; x2=cd2[p1++];
for (i=1;i<=2;i++)
{if(a1[x1.l][x1.c+t[i]]==0)
{ a1[x1.l][x1.c+t[i]]=a1[x1.l][x1.c]+1;
cd1[++u].l=x1.l;
cd1[u].c=x1.c+t[i];}
if(a2[x2.l][x2.c+t[i]]==0)
{ a2[x2.l][x2.c+t[i]]=a2[x2.l][x2.c]+1;
cd2[++u1].l=x2.l;
cd2[u1].c=x2.c+t[i];}
if(a1[x1.l+t[i]][x1.c]==0)
{ a1[x1.l+t[i]][x1.c]=a1[x1.l][x1.c]+1;
cd1[++u].l=x1.l+t[i];
cd1[u].c=x1.c;}
if(a2[x2.l+t[i]][x2.c]==0)
{ a2[x2.l+t[i]][x2.c]=a2[x2.l][x2.c]+1;
cd2[++u1].l=x2.l+t[i];
cd2[u1].c=x2.c;}
if(a1[x1.l+t[i]][x1.c+t[i]]==0)
{ a1[x1.l+t[i]][x1.c+t[i]]=a1[x1.l][x1.c]+1;
cd1[++u].l=x1.l+t[i];
cd1[u].c=x1.c+t[i];}
if(a2[x2.l+t[i]][x2.c+t[i]]==0)
{ a2[x2.l+t[i]][x2.c+t[i]]=a2[x2.l][x2.c]+1;
cd2[++u1].l=x2.l+t[i];
cd2[u1].c=x2.c+t[i];}
if(a1[x1.l+t[i]][x1.c-t[i]]==0)
{ a1[x1.l+t[i]][x1.c-t[i]]=a1[x1.l][x1.c]+1;
cd1[++u].l=x1.l+t[i];
cd1[u].c=x1.c-t[i];}
if(a2[x2.l+t[i]][x2.c-t[i]]==0)
{ a2[x2.l+t[i]][x2.c-t[i]]=a2[x2.l][x2.c]+1;
cd2[++u1].l=x2.l+t[i];
cd2[u1].c=x2.c-t[i];}}
}
tmin=11000;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if(a1[i][j]==a2[i][j] && tmin>a1[i][j] && a1[i][j]!=-1 && a1[i][j]!=1 && a1[i][j]!=0)
{ tmin=a1[i][j];
x=i;
y=j;}
fprintf(g,"%d %d %d",tmin,x,y);
fclose(f);fclose(g);
return 0;}