Cod sursa(job #2593480)

Utilizator vlad_dimuVlad Dimulescu vlad_dimu Data 3 aprilie 2020 23:41:26
Problema Rj Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <stdio.h>

#define MAXC 128
#define MAXN 100

short dl[9] = { -1, -1, -1, 0, 0, 0, 1, 1, 1};
short dc[9] = { -1, 0, 1, -1, 0, 1, -1, 0, 1};

int r[MAXN + 2][MAXN + 2], ju[MAXN + 2][MAXN + 2];
short coadal[MAXC + 1], coadac[MAXC + 1];

int main(){
  FILE *fin, *fout;
  fin = fopen( "rj.in", "r" );
  fout = fopen( "rj.out", "w" );
  int n, m, i, j, rl = 0, rc = 0, jl = 0, jc = 0;
  char ch;
  fscanf( fin, "%d", &m );
  fscanf( fin, "%d", &n );
  ch = fgetc( fin );
  for( i = 1; i <= m; i++ ){
    for( j = 1; j <= n; j++ ){
      ch = fgetc( fin );
      if( ch == 'X' ){
        r[i][j] = -1;
        ju[i][j] = -1;
      }
      else if( ch == 'R' ){
        rl = i;
        rc = j;
      }
      else if( ch == 'J' ){
        jl = i;
        jc = j;
      }
    }
    ch = fgetc( fin );
  }
  for( i = 0; i <= n + 1; i++ ){
    r[0][i] = -2;
    r[m + 1][i] = -2;
    ju[0][i] = -2;
    ju[m + 1][i] = -2;
  }
  for( i = 0; i <= m + 1; i++ ){
    r[i][0] = -2;
    r[i][n + 1] = -2;
    ju[i][0] = -2;
    ju[i][n + 1] = -2;
  }
  int p, u, dist, lin, col;
  p = u = 0;
  coadal[u] = rl;
  coadac[u] = rc;
  u = (u + 1) % MAXC;
  dist = 1;
  r[rl][rc] = dist;
  do{
    lin = coadal[p];
    col = coadac[p];
    p = (p + 1) % MAXC;
    dist = r[lin][col];
    for( i = 0; i < 9; i++ ){
      if( r[lin + dl[i]][col + dc[i]] == 0 ){
        coadal[u] = lin + dl[i];
        coadac[u] = col + dc[i];
        u = (u + 1) % MAXC;
        r[lin + dl[i]][col + dc[i]] = dist + 1;
      }
    }
  }while( p != u );

  p = u = 0;
  coadal[u] = jl;
  coadac[u] = jc;
  u = (u + 1) % MAXC;
  dist = 1;
  ju[jl][jc] = dist;
  do{
    lin = coadal[p];
    col = coadac[p];
    p = (p + 1) % MAXC;
    dist = ju[lin][col];
    for( i = 0; i < 9; i++ ){
      if( ju[lin + dl[i]][col + dc[i]] == 0 ){
        coadal[u] = lin + dl[i];
        coadac[u] = col + dc[i];
        u = (u + 1) % MAXC;
        ju[lin + dl[i]][col + dc[i]] = dist + 1;
      }
    }
  }while( p != u );
  int drum = 1000000, imin = 200, jmin = 200;
  for( i = 1; i <= m; i++ ){
    for( j = 1; j <= n; j++ ){
      if( r[i][j] == ju[i][j] && r[i][j] > 0 ){
        if( drum > r[i][j] ){
          drum = r[i][j];
          imin = i;
          jmin = j;
        }
        else if( drum == r[i][j] ){
          if( i < imin ){
            imin = i;
            jmin = j;
          }
          else if( i == imin && j < jmin )
            jmin = j;
        }
      }
    }
  }
  fprintf( fout, "%d %d %d", drum, imin, jmin );
  fclose( fin );
  fclose( fout );
  return 0;
}