Cod sursa(job #1853050)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 21 ianuarie 2017 13:26:54
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <utility>
using namespace std;

ifstream fi ("barbar.in");
ofstream fo ("barbar.out");

struct coord{
  int x, y;
  bool operator ==(coord b){
    return (x==b.x && y==b.y);
  }
  coord operator +(coord b){
    return {x+b.x,y+b.y};
  }
  void operator =(coord b){
    x=b.x;
    y=b.y;
  }
  coord operator -(coord b){
    return {x-b.x,y-b.y};
  }
} dragoni[1000000], dir[4]={ {-1,0}, {0,1}, {1,0}, {0,-1} }, intr, uscita;

bool obs[1002][1002], mark[1002][1002];
queue <pair<coord,int>> q;
int dist[1002][1002], n, m;

inline bool existadrum(int dmin){
  coord loc;
  int i, j;
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      mark[i][j]=false;
  q.push({intr,0});
  mark[intr.x][intr.y]=true;
  while(q.size()>0){
    loc=q.front().first;
    for(i=0;i<4;i++){
      loc=loc+dir[i];
      if(!obs[loc.x][loc.y] && !mark[loc.x][loc.y] && dist[loc.x][loc.y]>=dmin){
        q.push({loc,0});
        mark[loc.x][loc.y]=true;
      }
      loc=loc-dir[i];
    }
    q.pop();
  }
  return mark[uscita.x][uscita.y];
}

int main()
{
  int nrd, i, j, d, rez, pas;
  fi>>n>>m;
  char ch;
  coord loc;
  nrd=0;
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++){
      fi>>ch;
      if(ch=='*')
        obs[i][j]=true;
      if(ch=='D')
        dragoni[nrd++]={i,j};
      if(ch=='I')
        intr={i,j};
      if(ch=='O')
        uscita={i,j};
    }
  for(i=0;i<=n+1;i++)
    obs[i][0]=obs[i][m+1]=true;
  for(j=0;j<=m;j++)
    obs[0][j]=obs[n+1][j]=true;
  for(i=0;i<nrd;i++){
    q.push({dragoni[i],0});
    mark[dragoni[i].x][dragoni[i].y]=true;
  }
  while(q.size()>0){
    loc=q.front().first;
    d=q.front().second;
    dist[loc.x][loc.y]=d;
    for(i=0;i<4;i++){
      loc=loc+dir[i];
      if(!obs[loc.x][loc.y] && !mark[loc.x][loc.y]){
        q.push({loc,d+1});
        mark[loc.x][loc.y]=true;
      }
      loc=loc-dir[i];
    }
    q.pop();
  }
  rez=0;
  for(pas=1<<9;pas>=1;pas/=2)
    if(pas+rez<min(n,m) && existadrum(pas+rez))
      rez+=pas;
  if(rez>0)
    fo<<rez;
  else
    fo<<-1;
  return 0;
}