Cod sursa(job #3353390)

Utilizator ana.veronica13Ana Veronica Draghici ana.veronica13 Data 6 mai 2026 18:59:56
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

#define MAX_N 1005

int mat[MAX_N][MAX_N], dist[MAX_N][MAX_N], viz[MAX_N][MAX_N], x, finishl, finishc, n, m, startl, startc, ldir[] = { -1, 0, 1, 0 }, cdir[] = { 0, 1, 0, -1 };
queue< pair<int, int> > q;

void bfs(){
  int d, x, y, lin, col;
  while( !q.empty() ){
    x = q.front().first;
    y = q.front().second;
    q.pop();
    for( d = 0; d < 4; d++ ){
      lin = x + ldir[d];
      col = y + cdir[d];
      if( lin > 0 && lin <= n && col > 0 && col <= m && mat[lin][col] != 1 && dist[x][y] + 1 < dist[lin][col] ){
        q.push(make_pair(lin, col));
        dist[lin][col] = dist[x][y] + 1;
      }
    }
  }
}

void check( int l, int c, int mid ){
  int d, lin, col;
  if( l == finishl && c == finishc ){
    x = 1;
    return;
  }
  viz[l][c] = 1;
  for( d = 0; d < 4; d++ ){
    lin = l + ldir[d];
    col = c + cdir[d];
    if( lin > 0 && lin <= n && col > 0 && col <= m && viz[lin][col] == 0 && dist[lin][col] >= mid && mat[l][c] != 1 ){
      check( lin, col, mid );
    }
  }
}

int main(){
  ifstream cin("barbar.in");
  ofstream cout( "barbar.out");
  int l, c, st, dr, mid, ans;
  string s;
  cin >> n >> m;
  for( l = 1; l <= n; l++ ){
    for( c = 1; c <= m; c++ )
      dist[l][c] = INT_MAX;
  }
  for( l = 1; l <= n; l++ ){
    cin >> s;
    for( c = 1; c <= m; c++ ){
      if( s[c - 1] == '*' )
        mat[l][c] = 1;
      else if( s[c - 1] == 'D' ){
        mat[l][c] = 2;
        q.push( make_pair(l, c) );
        dist[l][c] = 0;
      }
      else if( s[c - 1] == 'I' ){
        startl = l;
        startc = c;
      }
      else if( s[c - 1] == 'O' ){
        finishl = l;
        finishc = c;
      }
        
    }
  }
  bfs();
  /*for( l = 1; l <= n; l++ ){
    for( c = 1; c <= m; c++ ){
      cout << dist[l][c] << " ";
    }
    cout << "\n";
  }*/
  st = 0;
  dr = n * m;
  ans = -1;
  while( st <= dr ){
    mid = ( st + dr ) / 2;
    x = 0;
    for( l = 1; l <= n; l++ ){
      for( c = 1; c <= m; c++ )
        viz[l][c] = 0;
    }
    check( startl, startc, mid );
    if( x == 1 ){
      ans = mid;
      st = mid + 1;
    }
    else
      dr = mid - 1;
  }
  cout << ans;
    return 0;
}