Cod sursa(job #2293181)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 30 noiembrie 2018 17:21:16
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
# include<cstdio>
# include<queue>
# include<cstdlib>
const int NMAX = 1000;
struct lee
{
    int x , y , distanta , dragx , dragy;
};
struct lee2
{
    int x , y;
};
int n , m , startx , starty , stopx , stopy;
int viz[NMAX + 1][NMAX + 1];
int dx[] = {0 , -1 , 0 ,1 , 0};
int dy[] = {0 , 0 , 1 , 0 , -1};
std :: queue <lee> q;
std :: queue <lee2>q2;
int distanta(int x1 ,int y1 ,int x2 ,int y2)
{
return abs(x1 - x2) + abs(y1 - y2);
}
int v[NMAX + 1][NMAX + 1];
int distante[NMAX + 1][NMAX + 1];
int check(int sol)
{
  for(int i = 1; i <= n ; i ++)
    for(int j = 1; j <= m ; j ++)
    viz[i][j] = 0;
  if(sol <= distante[startx][starty]){
    q2.push({startx , starty});
    viz[startx][starty] = 1;
  }
  while(q2.empty() == false)
  {
    lee2 aux = q2.front();
    q2.pop();
    for(int i = 1; i <= 4 ; i ++)
    {
      lee2 next;
      next.x = aux.x + dx[i];
      next.y = aux.y + dy[i];
      if(viz[next.x][next.y] == 0 && distante[next.x][next.y] >= sol)
      {
        q2.push(next);
        viz[next.x][next.y] = 1;
      }
    }
  }
  if(viz[stopx][stopy] == 1)
    return false;
  return true;
}
int bs()
{
    int r = 0 , p2 = 1 << 20;
    while(p2)
    {
        if(check(r + p2) == 0)
            r += p2;
        p2 /= 2;
    }
    return r;
}
int main()
{
    freopen("barbar.in" , "r" , stdin);
    freopen("barbar.out" , "w" , stdout);
    scanf("%d%d ", &n , &m);
    for(int i = 1; i <= n ; i ++)
    {
        for(int j = 1 ; j <= m ; j ++){
            scanf("%c " , &v[i][j]);
            distante[i][j] = 999999;
            if(v[i][j] == 'D'){
                q.push({i , j , 0 , i , j});
                distante[i][j] = 0;
            }
            if(v[i][j] == 'I')
            {startx = i;starty = j;}
            if(v[i][j] == 'O')
            {stopx = i;stopy = j;}


        }
    }
    while(q.empty() == false)
    {
        lee aux = q.front() , nexta;
        q.pop();
        for(int i = 1; i <= 4 ; i ++)
        {
            nexta.x = aux.x + dx[i];
            nexta.y = aux.y + dy[i];
            nexta.distanta = aux.distanta + 1;
            nexta.dragx = aux.dragx;
            nexta.dragy = aux.dragy;
            if(nexta.distanta < distante[nexta.x][nexta.y] && v[nexta.x][nexta.y] != '*')
            {
                distante[nexta.x][nexta.y] = nexta.distanta;
                q.push(nexta);
            }
        }
    }
    int sol = bs();
    if(sol == 0)
      sol = -1;
    printf("%d" ,sol);
return 0;
}