Cod sursa(job #2303500)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 16 decembrie 2018 13:45:11
Problema Barbar Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.99 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,end;
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;
  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[end.first][end.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' )
          end.first = i, end.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 > 0 ) {
      pas = pas / 2;
      if( r + pas <= distante[start.first][start.second] && verif( r + pas ) == 1 )
        r += pas;
    }
    printf("%d",r);
    return 0;
}