Cod sursa(job #2107299)

Utilizator Monstergentleman35Ciopraga Razvan Monstergentleman35 Data 16 ianuarie 2018 22:57:45
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.99 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <deque>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n,m,Mem[1005][1005],DistDrag[1005][1005];
int MatLee[1005][1005];
char aux;
int Rl[5]={0,-1,0,1,0};
int Rc[5]={0,0,1,0,-1};
int linie,coloana,aux1,F;
int pornirel,pornirec,iesirel,iesirec,maxd;
int liniev,coloanav,linie1,coloana1;
deque < pair < int, int > > decoada;

void umplere(int,int);
int cbin(int);
bool Lee(int);

int main()
{
 fin>>n>>m;
 for (linie=1;linie<=n;linie++)
  for (coloana=1;coloana<=m;coloana++)
   DistDrag[linie][coloana]=999999;
 for (linie=0;linie<=n+1;linie++)
  Mem[linie][0]=Mem[linie][m+1]=-1;
 for (coloana=0;coloana<=m+1;coloana++)
  Mem[0][coloana]=Mem[n+1][coloana]=-1;
 for (linie=1;linie<=n;linie++)
  for (coloana=1;coloana<=m;coloana++)
 {
  fin>>aux;
  if (aux=='I')
  {
   pornirel=linie;
   pornirec=coloana;
  }
  else if (aux=='O')
  {
   iesirel=linie;
   iesirec=coloana;
  }
  else if (aux=='D')
  {
   umplere(linie,coloana);
   DistDrag[linie][coloana]=0;
  }

  else if (aux=='*')
   Mem[linie][coloana]=9999999;
 }
 for (linie=1;linie<=n;linie++)
  for (coloana=1;coloana<=m;coloana++)
   if (maxd<DistDrag[linie][coloana])
    maxd=DistDrag[linie][coloana];
 F=cbin(maxd);
 fout<<-1;
 return 0;
}

void umplere(int linieD,int coloanaD)
{
 int stl,sfl,stc,sfc,i,d;
 stl=linieD-1;
 sfl=linieD+1;
 stc=coloanaD-1;
 sfc=coloanaD+1;
 d=1;
 while (stl>=1||sfl<=n||stc>=1||sfc<=m)
 {
  stl=max(1,stl);
  sfl=min(n,sfl);
  stc=max(1,stc);
  sfc=min(m,sfc);
   for (i=stc;i<=sfc;i++)
    DistDrag[stl][i]=min(DistDrag[stl][i],d);
   for (i=stl;i<=sfl;i++)
    DistDrag[i][stc]=min(DistDrag[i][stc],d);
   for (i=stc;i<=sfc;i++)
    DistDrag[sfl][i]=min(DistDrag[sfl][i],d);
   for (i=stl;i<=sfl;i++)
    DistDrag[i][sfc]=min(DistDrag[i][sfc],d);
  d++;
  stl--;
  sfl++;
  stc--;
  sfc++;
 }
}

int cbin(int max1)
{
 int st,sf,mij,aux,ok;
 aux=0;
 st=0;
 sf=max1;
 while (st<=sf)
 {
  mij=(st+sf)/2;
  if (Lee(mij))
  {
   aux=mij;
   ok=1;
   st=mij+1;
  }
  else
   sf=mij-1;
 }
 if (ok==1)
  return aux;
 else
  return -1;
}

bool Lee(int aux1)
{
 int i;
 decoada.begin();
 decoada.push_back(make_pair(pornirel,pornirec));
 for (liniev=1;liniev<=n;liniev++)
  for (coloanav=1;coloanav<=m;coloanav++)
   MatLee[liniev][coloanav]=Mem[liniev][coloanav];
 MatLee[pornirel][pornirec]=1;
 while (!decoada.empty()&&MatLee[iesirel][iesirec]==0)
 {
  linie1=decoada.front().first;
  coloana1=decoada.front().second;
  decoada.pop_front();
  for (i=1;i<=4;i++)
  {
   liniev=linie1+Rl[i];
   coloanav=coloana1+Rc[i];
   if (MatLee[liniev][coloanav]==0&&DistDrag[liniev][coloanav]>=aux1)
   {
    MatLee[liniev][coloanav]=MatLee[linie1][coloana1]+1;
    decoada.push_back(make_pair(liniev,coloanav));
   }
  }
 }
 if (MatLee[iesirel][iesirec]!=0)
  return 1;
 else
  return 0;
}