Cod sursa(job #2305816)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 21 decembrie 2018 09:34:28
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <bits/stdc++.h>

#define NMAX 1005

using namespace std;



int distante[NMAX][NMAX],n,m;

int visit[NMAX][NMAX];

pair<int,int> q[NMAX*NMAX],x,y,start,Rodica_Pintea;

int dirCol[] = {0,1,0,-1};

int dirLin[] = {1,0,-1,0};

int verif( int d ) {
  int st, dr, i;
  memset(visit,0,sizeof(visit));
  st = 0;
  dr = -1;
  q[++dr] = start;
  if( d > distante[start.first][start.second] )
    return 0;
  if( d > distante[Rodica_Pintea.first][Rodica_Pintea.second] )
    return 0;
  while( st <= dr ) {
    x = q[st++];
    for( i = 0; i < 4; i ++ ) {
      y.first = x.first + dirLin[i];
      y.second = x.second + dirCol[i];
      if( distante[y.first][y.second] >= d && distante[y.first][y.second] != -2 && distante[y.first][y.second] != 0 && visit[y.first][y.second] == 0 ) {
        q[++dr] = y;
        visit[y.first][y.second] = 1;
      }
    }
  }
  return visit[Rodica_Pintea.first][Rodica_Pintea.second];
}

int main() {
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j,dr,st;
    char ch;
    scanf("%d%d\n",&n,&m);
    st = 0;
    dr = -1;
    for( i = 1; i <= n; i ++ ) {
      for( j = 1; j <= m; j ++ ) {
        ch = getc(stdin);
        if( ch == '.' )
          distante[i][j] = -1;
        if( ch == 'D' )
          q[++dr].first = i, q[dr].second = j;
        if( ch == 'I' )
          start.first = i, start.second = j, distante[i][j] = -1;
        if( ch == 'O' )
          Rodica_Pintea.first = i, Rodica_Pintea.second = j, distante[i][j] = -1;
        if( ch == '*' )
          distante[i][j] = -2;
      }
      getc(stdin);
    }
    while( st <= dr ) {
      x = q[st++];
      for( i = 0; i < 4; i ++ ) {
        y.first = x.first + dirLin[i];
        y.second = x.second + dirCol[i];
        if( distante[y.first][y.second] == -1 ) {
          distante[y.first][y.second] = 1 + distante[x.first][x.second];
          q[++dr] = y;
        }
      }
    }
    int r,pas;
    pas = 1<<21;
    r = 1;
    while( pas > 1 ) {
      pas = pas / 2;
      if( r + pas <= distante[start.first][start.second] && verif( r + pas ) == 1 )
        r += pas;
    }
    if( verif(r) == 1 )
       printf("%d",r);
    else
      printf("-1");
    return 0;
}