Cod sursa(job #214540)

Utilizator cristiprgPrigoana Cristian cristiprg Data 14 octombrie 2008 23:03:28
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#define fin "rj.in"
#define fout "rj.out"
#define dim 105
#define inf 32000
#define inf2 31000

FILE* in;
FILE* out;

int a[dim][dim],b[dim][dim],n,m,ir,jr,ij,jj;

const int vi[]={-1,-1,0,1,1,1,0,-1};
const int vj[]={0,1,1,1,0,-1,-1,-1};


void Read()
{
  fscanf(in,"%i%i",&n,&m);
  int i,j;
  char c;
  fscanf(in,"%c",&c);
  for(i=1;i<=n;++i)
    for(j=1;j<=m;++j)
    {
      start:
      fscanf(in,"%c",&c);
      if(c=='\n')
	goto start;
      if(c=='X')
	a[i][j]=inf2;
      if(c=='R')
 //	coada[0][1]=i,coada[1][1]=j,b[i][j]=1;
	ir=i,jr=j,b[i][j]=1;
      if(c=='J')
 //	coada[0][2]=i,coada[1][2]=j,b[i][j]=1;
	ij=i,jj=j,b[i][j]=1;
      b[i][j]=inf;
    }
 for(j=0;j<=m+1;++j)
   b[0][j]=inf,b[n+1][j]=inf;
 for(i=0;i<=n+1;++i)
   b[i][0]=inf,b[i][m+1]=inf;
}

int OK(int i,int j)
{
  if(i<1 || i>n || j<1 || j>m) return 0;
  if(b[i][j]!=inf) return 0;
  if(a[i][j]==inf2) return 0;

  return 1;
}

void lee()
{
  int st,dr,im,jm,i,j,d;
  int coada[2][dim*dim];
  coada[0][1]=ir,coada[1][1]=jr;
  coada[0][2]=ij,coada[1][2]=jj;
  b[ir][jr]=1;
  b[ij][jj]=-1;
  st=1,dr=2;
  while(st<=dr)
  {
    i=coada[0][st];
    j=coada[1][st];
    for(d=0;d<8;++d)
    {
      im=i+vi[d];
      jm=j+vj[d];
      if(b[im][jm]==-1*b[i][j]+1 || b[im][jm]==-1*b[i][j]-1) // Victory !!!
	{fprintf(out,"%i %i %i\n",b[im][jm],im,jm);return ;}

      if(OK(im,jm))
      {
	if(b[i][j]>=0)
	   b[im][jm]=b[i][j]+1;
	else
	   b[im][jm]=b[i][j]-1;

	dr++;
	coada[0][dr]=im;
	coada[1][dr]=jm;
      }
    }
    st++;
  }
  fprintf(out,"cacat\n");
}


int main()
{
  in = fopen (fin,"r");
  out = fopen (fout,"w");
  Read();
  lee();

  fclose(in);
  fclose(out);
  return 0;
}