Cod sursa(job #322846)

Utilizator rusu_raduRusu Radu rusu_radu Data 9 iunie 2009 23:11:44
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <stdio.h>
#define Nmax 105
#define InFile "rj.in"
#define OutFile "rj.out"

int n, m, pas, dl[]={-1, -1, 0, 1, 1, 1, 0, -1}, dc[]={0 , 1, 1, 1, 0, -1, -1, -1};
int Rom[Nmax][Nmax], Jul[Nmax][Nmax];
struct Pct {int x, y;} intal, romeo, julieta;

void citire();
void bordare (int a[Nmax][Nmax]);
void lee_jul();
void lee_rom();
void determinare();
void afisare();

int main()
{
  citire();
  bordare (Jul);
  bordare (Rom);
  lee_jul();
  lee_rom();
  determinare();
  afisare();
  return 0;
}

void citire()
{
  int i, j;
  char c;
  FILE *fin=fopen (InFile, "r");
  fscanf (fin, "%d %d", &n, &m);
  for (i=1; i<=n ;i++)
  {
    for (j=1; j<=m; j++)
    {
      fscanf (fin, "%c", &c);
      if (c=='R') {romeo.x=i; romeo.y=j;}
      if (c=='J') {julieta.x=i; julieta.y=j;}
      if (c=='X') {Rom[i][j]=-1; Jul[i][j]=-1;}
    }
    fscanf (fin , "\n");
  }
}

void bordare (int a[Nmax][Nmax])
{
  int i;
  for (i=0; i<=n+1; i++)
    a[0][i]=a[m+1][i]=-1;
  for (i=0; i<=m+1; i++)
    a[i][0]=a[i][n+1]=-1;
}

void lee_jul()
{
  Pct aj, ajut, C[Nmax*Nmax];
  int inc=0, sf=0, k;
  C[sf]=julieta; Jul[julieta.x][julieta.y]=1;
  while (inc<=sf)
  {
    aj=C[inc++];
    for (k=0; k<8; k++)
    {
      ajut.x=aj.x+dl[k]; ajut.y=aj.y+dc[k];
      if (Jul[ajut.x][ajut.y]!=-1 && !Jul[ajut.x][ajut.y] && (ajut.x!=julieta.x || ajut.y!=julieta.y))
      {
        Jul[ajut.x][ajut.y]=Jul[aj.x][aj.y]+1;
        C[++sf]=ajut;
      }
    }
  }
}

void lee_rom()
{
  Pct aj, ajut, C[Nmax*Nmax];
  int inc=0, sf=0, k;
  C[sf]=romeo; Rom[romeo.x][romeo.y]=1;
  while (inc<=sf)
  {
    aj=C[inc++];
    for (k=0; k<8; k++)
    {
      ajut.x=aj.x+dl[k]; ajut.y=aj.y+dc[k];
      if (Rom[ajut.x][ajut.y]!=-1 && !Rom[ajut.x][ajut.y] && (ajut.x!=romeo.x || ajut.y!=romeo.y))
      {
        Rom[ajut.x][ajut.y]=Rom[aj.x][aj.y]+1;
        C[++sf]=ajut;
      }
    }
  }
}

void determinare()
{
  int i, j;
  pas=0;
  for (i=1; i<=n; i++)
    for (j=1; j<=m; j++)
      if (Jul[i][j]==Rom[i][j]&&Rom[i][j]>pas)
      {
        pas=Rom[i][j];
        intal.x=i; intal.y=j;
      }
}

void afisare()
{
  FILE *fout=fopen (OutFile, "w");
  fprintf (fout, "%d %d %d\n", pas, intal.x, intal.y);
  fclose (fout);
}