Cod sursa(job #374398)

Utilizator arnold23Arnold Tempfli arnold23 Data 16 decembrie 2009 22:48:29
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <stdio.h>
#include <stdlib.h>
long i,j,n,m,rx,ry,jx,jy,t;
char c;
short a [1000][1000];
long rom[1000][1000],jul[1000][1000];
short cx[8] = {0,0,-1,1,1,-1,1,-1};
short cy[8] = {1,-1,0,0,1,-1,-1,1};

typedef struct nod{
   long x,y,l;
   nod* kov;
} *lista, elem;

int add(lista &vege,long x1, long y1, long le)
{
 lista p = new elem;
 p->x=x1;
 p->y=y1;
 p->l=le;
 p->kov=NULL;
 vege->kov=p;
 vege=p;
 return 0;
}

int bejarrom(long kx,long ky)
{
  lista el = new elem;
  el->x=kx;
  el->y=ky;
  el->l=0;
  el->kov=NULL;
  lista ve = el;

  rom[kx][ky]=1;
  long ux,uy;
  short ok=0;
  while(el!=NULL&&ok==0){
    for(i=0;i<=7;++i){
    ux=el->x+cx[i];
    uy=el->y+cy[i];

    if(ux>=1&&ux<=n&&uy>=1&&uy<=m){
     if(rom[ux][uy]==0&&a[ux][uy]==0){
      add(ve,ux,uy,el->l+1);
      rom[ux][uy]=el->l+1;
      if(ux==jx&&uy==jy){
        ok=1;
      }
     }
    }
    }
   el=el->kov;
  }
 return 0;
}

int bejarjul(int kx,int ky)
{
  lista el = new elem;
  el->x=kx;
  el->y=ky;
  el->l=0;
  el->kov=NULL;
  lista ve = el;

  jul[kx][ky]=1;
  long ux,uy;
  short ok=0;
  while(el!=NULL&&ok==0){
    for(i=0;i<=7;++i){
    ux=el->x+cx[i];
    uy=el->y+cy[i];

    if(ux>=1&&ux<=n&&uy>=1&&uy<=m){
     if(jul[ux][uy]==0&&a[ux][uy]==0){
      add(ve,ux,uy,el->l+1);
      jul[ux][uy]=el->l+1l;
      if(ux==rx&&uy==ry){
        ok=1;
        t=(el->l+1)/2;
      }
     }
    }
    }
   el=el->kov;
  }
 return 0;
}

int main()
{
 freopen("rj.in","r",stdin);
 freopen("rj.out","w",stdout);

 scanf("%ld %ld\n",&n,&m);
 for(i=1;i<=n;++i)
 {
    for(j=1;j<=m;++j){
    scanf("%c",&c);
     if(c=='R'){
       rx=i;
       ry=j;
     } else
     if(c=='J'){
       jx=i;
       jy=j;
     } else
     if(c=='X'){
       a[i][j]=1;
     } else
     { a[i][j]=0; }
     }
     scanf("\n");
 }

 bejarrom(rx,ry);
 bejarjul(jx,jy);

 for(i=1;i<=n;++i)
  for(j=1;j<=m;++j)
   if(rom[i][j]==jul[i][j]&&rom[i][j]==t)
   {
     printf("%ld %ld %ld",rom[i][j],i,j);
     exit(1);
   }

 return 0;
}