Cod sursa(job #2557719)

Utilizator cristiemanuelstroe cristian emanuel cristiemanuel Data 25 februarie 2020 22:46:39
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include    <iostream>
#include    <fstream>
#include    <queue>

using namespace std;

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


const int nm=1001;
const int di[]={-1,0,1,0},
          dj[]={0,1,0,-1};


int n,m;
int M[nm][nm],B[nm][nm],D[nm][nm];
int istart,jstart;
int istop,jstop;
char c;
int ans;

queue < pair< int, int> > Q;

void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++){
            fin>>c;
           if(c=='*') M[i][j]=-1;
            else if(c=='D') M[i][j]=-1,Q.push(make_pair(i,j));
            else if(c=='I') istart=i,jstart=j;
            else if(c=='O') istop=i,jstop=j;
         }
}

bool ok(int i, int j)
{
    if(i<1 || j<1 || i>n || j>m) return false;
    if(M[i][j]==-1) return false;
    return true;
}

void Lee()
{

   while(!Q.empty())
   {
     int i=Q.front().first;
     int j=Q.front().second;
     Q.pop();
       for(int d=0;d<4;d++)
       {
           int i_n=i+di[d];
           int j_n=j+dj[d];
           if(ok(i_n,j_n) && (B[i_n][j_n]>B[i][j]+1 || !B[i_n][j_n]))
           {
               B[i_n][j_n]=B[i][j]+1;
               Q.push(make_pair(i_n,j_n));
           }
       }
   }
}


int verif(int d)
{

  while(!Q.empty())
     Q.pop();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        D[i][j]=0;
    D[istart][jstart]=1;
    if(B[istart][jstart]>=d)  Q.push(make_pair(istart,jstart));
    else return 0;
    while(!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        for(int dir=0;dir<4;dir++)
        {
            int i_n=i+di[dir];
            int j_n=j+dj[dir];
            if(ok(i_n,j_n) && B[i_n][j_n]>=d && (D[i_n][j_n]>D[i][j]+1 || D[i_n][j_n]==0))
            {
                if(i_n==istop && j_n==jstop) return 1;
                D[i_n][j_n]=D[i][j]+1;
                Q.push(make_pair(i_n,j_n));
            }
        }
    }
    return 0;
}
void CautBin(int st, int dr)

{

    while(st <= dr)

    {

        int mij = (st + dr)/2;

        if(verif(mij) == 1)

        {

            ans = mij;

            st = mij + 1;

        }

        else

            dr = mij - 1;

    }

}
int main()
{
   citire();
   Lee();
   CautBin(0,n*m);
   if(!ans) fout<<-1;
   else fout<<ans;
}