Cod sursa(job #335365)

Utilizator rusu_raduRusu Radu rusu_radu Data 29 iulie 2009 19:04:35
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <stdio.h>
#define Nmax 105
#define InFile "rj.in"
#define OutFile "rj.out"

int n, m, max, imax, jmax;
int Rom[Nmax][Nmax], Jul[Nmax][Nmax];
struct punct {int x, y;} rom, jul;

void citire();
void bordare();
void lee_rom();
void lee_jul();
void determinare();
void afisare();

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

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

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

void lee_rom()
{
  int i;
  punct x, y;
  punct C[Nmax*Nmax];
  int inc=-1, sf=-1;
  int dl[]={-1, -1, 0, 1, 1, 1, 0, -1}, dc[]={0, 1, 1, 1, 0, -1, -1, -1};
  //initializez coada
  sf++;
  C[sf]=rom;
  while (inc<sf)
  {
    //scot un element din coada
    inc++; x=C[inc];
    for (i=0; i<8; i++)
    {
      y.x=x.x+dl[i]; y.y=x.y+dc[i];
      if (Rom[y.x][y.y]==0&&(y.x!=rom.x||y.y!=rom.y))
      {
        sf++;
        C[sf]=y;
        Rom[y.x][y.y]=Rom[x.x][x.y]+1;
      }
    }
  }
}

void lee_jul()
{
  int i;
  punct x, y;
  punct C[Nmax*Nmax];
  int inc=-1, sf=-1;
  int dl[]={-1, -1, 0, 1, 1, 1, 0, -1}, dc[]={0, 1, 1, 1, 0, -1, -1, -1};
  //initializez coada
  sf++;
  C[sf]=jul;
  while (inc<sf)
  {
    //scot un element din coada
    inc++; x=C[inc];
    for (i=0; i<8; i++)
    {
      y.x=x.x+dl[i]; y.y=x.y+dc[i];
      if (Jul[y.x][y.y]==0&&(y.x!=jul.x||y.y!=jul.y))
      {
        sf++;
        C[sf]=y;
        Jul[y.x][y.y]=Jul[x.x][x.y]+1;
      }
    }
  }
}

void determinare()
{
  int i, j;
  max=Nmax*Nmax;
  for (i=1; i<=n; i++)
    for (j=1; j<=m; j++)
      if (Rom[i][j]==Jul[i][j]&&Rom[i][j]!=-1&&Rom[i][j]!=0&&Rom[i][j]<max-1)
      {
        max=Rom[i][j]+1;
        imax=i;
        jmax=j;
      }
}

void afisare()
{
  FILE *fout=fopen (OutFile, "w");
  fprintf (fout, "%d %d %d\n", max, imax, jmax);
  fclose (fout);
}