Cod sursa(job #217607)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 29 octombrie 2008 07:24:17
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<iostream>
#include<stdio.h>
FILE *f,*g;

int main()
{
 f=fopen("rj.in","r");
 g=fopen("rj.out","w");
 int m,n,i,j;         int rx,ry,jx,jy;
 char a[102][102];
 int dx[]={0,0,-1,-1,-1,1,1,1};        
 int dy[]={1,-1,0,1,-1,0,-1,1};
 fscanf(f,"%d %d\n",&n,&m);
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=m;j++)
   {
    fscanf(f,"%c",&a[i][j]);
    if(a[i][j]=='R') {rx=i;ry=j;}
    if(a[i][j]=='J') {jx=i;jy=j;}
   }
  fscanf(f,"\n");
 }
 int cl,cv,vb=0;
 int d[102][102],d1[102][102];
 for(i=0;i<=m+1;i++)
 {
  a[0][i]=d[0][i]=-1;
  a[n+1][i]=d[n+1][i]=-1;
 }
 for(i=0;i<=n+1;i++)
 {
  a[i][0]='1';
  a[i][m+1]='1';
 }
 for(i=1;i<=n;i++)
  for(j=1;j<=m;j++)
   {d[i][j]=d1[i][j]=0;}
 int k=1,x;

 d[rx][ry]=k;
 do
 {
  vb=0;
  for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
   {
    if(d[i][j]==k)
    {
     for(x=0;x<8;x++)
     {
      cl=i+dx[x];
      cv=j+dy[x];
      if((d[cl][cv]==0)&&(a[cl][cv]!='X')&&(a[cl][cv]!='1'))
      {
       d[cl][cv]=k+1;
       vb=1;
      }
     }
    }
   }
  if(vb)k++;
 }
 while(vb);
 k=1;
 d1[jx][jy]=k;
 do
 {
  vb=0;
  for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
   {
    if(d1[i][j]==k)
    {
     for(x=0;x<8;x++)
     {
      cl=i+dx[x];
      cv=j+dy[x];
      if((d1[cl][cv]==0)&&(a[cl][cv]!='X')&&(a[cl][cv]!='1'))
      {
       d1[cl][cv]=k+1;
       vb=1;
      }
     }
    }
   }
  if(vb)k++;
 }
 while(vb);
 int min=20000;
 for(i=1;i<=n;i++)
  for(j=1;j<=m;j++)
  {
   if(d[i][j]==d1[i][j])
    if(d[i][j]<min&&d[i][j]>0) {min=d[i][j];rx=i;ry=j;}
  }
 fprintf(g,"%d %d %d\n",min,rx,ry);
return 0;
}