Cod sursa(job #2165827)

Utilizator tavi255Varzaru Octavian Stefan tavi255 Data 13 martie 2018 13:51:46
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int di[4]={-1,0,1,0};
int dj[4]={0,1,0,-1};
int r,c,m2[1000][1000],stopx,stopy,m[1000][1000],startx,starty,m3[1000][1000];
char p;
queue < pair < int , int > >coada;
void citire()
{
  in>>r>>c;
  for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
    {
         in>>p;
         if(p=='I')
             {
                startx=i;
                starty=j;
             }

         else if(p=='O')
         {
             stopx=i;
             stopy=j;
         }
         else if(p=='D')
         {
             coada.push(make_pair(i,j));
             m[i][j]=1;
         }
         else if(p=='*')
            m[i][j]=-1;

    }


}
bool ok(int i ,int j)
{
    if(i<1 || j<1 ||i>r || j>c)
        return 0;
    if(m[i][j]==-1)
        return 0;
    return 1;
}
void Lee()
{
  while(!coada.empty())
  {
     int i=coada.front().first;
     int j=coada.front().second;
     coada.pop();
     for(int d=0;d<4;d++)
     {
         int ni=i+di[d];
         int nj=j+dj[d];
         if(ok(ni,nj) &&(m[ni][nj]==0))
         {
             m[ni][nj]=m[i][j]+1;
             coada.push(make_pair(ni,nj));
         }
     }
  }
}
void matrice()
{
  for(int i=1;i<=r;i++)
    for(int j=1;j<=c;j++)
        m2[i][j]=m3[i][j];
}
bool Lee2(int distanta)
{
    matrice();
    if(m[startx][starty]-1>=distanta)
    {
        m2[startx][starty]=1;
        coada.push(make_pair(startx,starty));
    }
    while(!coada.empty())
    {
         int i=coada.front().first;
     int j=coada.front().second;
     coada.pop();
     for(int d=0;d<4;d++)
     {
         int ni=i+di[d];
         int nj=j+dj[d];
         if(ok(ni,nj) &&(m2[ni][nj]==0)&&(m[ni][nj]-1>=distanta))
         {
             m2[ni][nj]=m2[i][j];
             coada.push(make_pair(ni,nj));
         }
    }
    }
    if(m2[stopx][stopy]!=0)
        return 1;
    return 0;
}
void sol()
{
    int st=1,dr=r*c,sol=-1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(Lee2(mij))
        {
           sol=mij;
           st=mij+1;
        }
        else
            dr=mij-1;
    }
    out<<sol;

}
void afisare()
{
     for(int i=1;i<=r;i++)
     {
           for(int j=1;j<=c;j++)
            cout<<m2[i][j]<<" ";
           cout<<"\n";
     }

}
int main()
{
    citire();
    Lee();
    sol();
    return 0;
}