Cod sursa(job #1414883)

Utilizator herbertoHerbert Mohanu herberto Data 3 aprilie 2015 11:12:48
Problema Rj Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <stdlib.h>
#define NIL -1
#define MAXN 105
int n, m, i, j, lin, col, prim, ultim, dist, g, h;
int L[MAXN][MAXN], queue[MAXN*MAXN][2], r[MAXN][MAXN], f[MAXN][MAXN], r2[MAXN][MAXN];
int dir[8][2]={{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {-1, 1}, {1, 1}, {1, -1}, {-1, -1}};
void lee(int a, int b, int f[MAXN][MAXN]){
  for(i=0; i<=n+1; i++)
    for(j=0; j<=m+1; j++)
      f[i][j]=NIL;
  queue[0][0]=a;
  queue[0][1]=b;
  f[a][b]=1;
  prim=0;
  ultim=1;
  while(prim<=ultim){
    lin=queue[prim][0];
    col=queue[prim][1];
    dist=f[lin][col];
    for(i=0;i<8;i++){
      g=lin+dir[i][0];
      h=col+dir[i][1];
      if(L[g][h]==0 && f[g][h]==-1){
        f[g][h]=dist+1;
        queue[ultim][0]=g;
        queue[ultim][1]=h;
        ultim++;
      }
    }
    prim++;
  }
}

int main(){
  FILE*fin=fopen("rj.in", "r");
  FILE*fout=fopen("rj.out", "w");
  int x1, y1, x2, y2, xmin, ymin, tmin;
  char c1;
  fscanf(fin, "%d%d", &n, &m);
  fgetc(fin);
  for(i=1; i<=n; i++){
    for(j=1; j<=m; j++){
      c1=fgetc(fin);
      if(c1=='X')
        L[i][j]=NIL;
      if(c1=='R'){
        x1=i;
        y1=j;
      }
      if(c1=='J'){
        x2=i;
        y2=j;
      }
      if(c1==' ')
        L[i][j]=0;
    }
    fgetc(fin);
  }
  for(i=0; i<=n+1; i++)
    L[i][0]=L[i][m+1]=NIL;

  for(j=0; j<=m+1; j++)
    L[0][j]=L[n+1][j]=NIL;
  lee(x1, y1, r);
  lee(x2, y2, r2);
  for (i=1; i<=n; i++)
    for (j=1; j<=m; j++)
      if (r[i][j]==r2[i][j] && r[i][j]<tmin && r2[i][j]!=-1){
        tmin=r[i][j];
        xmin=i;
        ymin=j;
      }


  fprintf(fout, "%d %d %d", tmin, xmin, ymin);
  return 0;
}