Cod sursa(job #2627767)

Utilizator euyoTukanul euyo Data 12 iunie 2020 14:14:33
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <fstream>
#include <cstdio>
#include <queue>
#define LIM 1000

using namespace std;

int T[LIM + 2][LIM + 2];
int dist[LIM + 2][LIM + 2]; 
char viz[LIM + 2][LIM + 2];
int mind[LIM + 2][LIM + 2];
queue<int> ql;
queue<int> qc;

int DX[4] = { 0, 1, 0, -1 };
int DY[4] = { 1, 0, -1, 0 };

int n, m;

void lee() {
  int i, j, l, c, ln, cn;

  for ( i = 1; i <= n; ++i ) {
    for ( j = 1; j <= m; ++j ) {
	  if ( T[i][j] == 'D' ) {
		ql.push( i );
		qc.push( j );
		viz[i][j] = 1;
	    dist[i][j] = 1;
	  }
	}
  }
  while ( !ql.empty() ) {
	l = ql.front();
    c = qc.front();
	ql.pop();
	qc.pop();
	for ( i = 0; i < 4; ++i ) {
      ln = l + DX[i];
	  cn = c + DY[i];
	  if ( !viz[ln][cn] && (T[ln][cn] == '.' || T[ln][cn] == 'I' || T[ln][cn] == 'O') ) {
        dist[ln][cn] = dist[l][c] + 1;
		viz[ln][cn] = 1;
		ql.push( ln );
		qc.push( cn );
	  }
	}
  }
}

void leeMax( int lI, int cI, int lO, int cO ) {
  int l = -1, c = -1, i, ln, cn;

  ql.push( lI );
  qc.push( cI );
  viz[lI][cI] = 1;
  mind[lI][cI] = dist[lI][cI];
  while ( !ql.empty() && (l != lO || c != cO) ) {
	l = ql.front();
    c = qc.front();
	ql.pop();
	qc.pop();
	for ( i = 0; i < 4; ++i ) {
      ln = l + DX[i];
	  cn = c + DY[i];
	  if ( !viz[ln][cn] && (T[ln][cn] == '.' || T[ln][cn] == 'I' || T[ln][cn] == 'O') ) {
        if ( mind[l][c] > dist[ln][cn] ) {
          mind[ln][cn] = dist[ln][cn];
		} else {
		  mind[ln][cn] = mind[l][c];
		}
		viz[ln][cn] = 1;
		ql.push( ln );
		qc.push( cn );
	  }
	}
  }
}

int main() {
  FILE *fin = fopen( "barbar.in", "r" );
  FILE *fout = fopen( "barbar.out", "w" );
  int i, j, lI, cI, lO, cO;

  fscanf( fin, "%d%d ", &n, &m );
  for ( i = 1; i <= n; ++i ) {
    for ( j = 1; j <= m; ++j ) {
      T[i][j] = fgetc( fin );
	  if ( T[i][j] == 'I' ) {
		lI = i;
		cI = j;
	  } else if ( T[i][j] == 'O' ) {
		lO = i;
		cO = j;
	  }
	}
	fgetc( fin );
  }
  for ( i = 0; i <= n + 1; ++i ) {
	T[i][m + 1] = T[i][0] = -1;
  }
  for ( j = 0; j <= m + 1; ++j ) {
    T[n + 1][j] = T[0][j] = -1;
  }
  lee();
  for ( i = 1; i <= n; ++i ) {
    for ( j = 1; j <= m; ++j ) {
	  viz[i][j] = 0;
	}
  }
  leeMax( lI, cI, lO, cO );
  fprintf( fout, "%d", mind[lO][cO] );
  fclose( fin );
  fclose( fout );
  return 0;
}