Cod sursa(job #2430741)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 16 iunie 2019 11:13:55
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <bits/stdc++.h>
#define maximm 1005
using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");


int mp[maximm][maximm],n,m,minim, maxim;
queue <pair <int,int> > coada;
bool ch[maximm][maximm], fin[maximm][maximm];
pair <int,int> start,finish;
int di[]={1,0,-1,0};
int dj[]={0,1,0,-1};



bool ok(int i, int j)
{
    return (i>0 && j >0 && i<=n && j<=m && mp[i][j]!=-1);
}


void lee()
{
    pair <int,int> q;

    while (!coada.empty())
    {
        q=coada.front();
        coada.pop();
        int i=q.first;
        int j=q.second;
        for (int d=0;d<4;d++)
        {
            int i1=i+di[d];
            int j1=j+dj[d];
            if (ok(i1,j1) && mp[i1][j1]==0 && ch[i1][j1]==0)
            {
                mp[i1][j1]=mp[i][j]+1;
                maxim=max(maxim,mp[i1][j1]);
                minim=min(minim,mp[i1][j1]);
                coada.push(make_pair(i1,j1));
            }
        }

    }
}


bool valid (int m)
{
    memset(fin,0, sizeof(fin));
    int i=start.first;
    int j=start.second;
    pair <int , int > q;
    if (mp[i][j] < m )
         return false;
    fin[i][j]=1;
    coada.push(make_pair(i,j));
    while (!coada.empty())
    {
        q=coada.front();
        coada.pop();
        i=q.first;
        j=q.second;

        for (int d=0;d<4;d++)
        {
            int i1=i+di[d];
            int j1=j+dj[d];
            if (ok(i1,j1) && fin[i1][j1]==0 && mp[i1][j1]>=m)
            {
                fin[i1][j1]=1;
                coada.push(make_pair(i1,j1));


            }
        }
    }
    if (fin[finish.first][finish.second]==1)
        return true;
    return false;
}
int bin()
{
    int ans=-1;
    int i=minim;
    int j=maxim;
    while (i <= j)
    {
        int m=(i+j)/2;
        if (valid(m))
        {
            ans=m;
            i=m+1;
        }
        else j=m-1;
    }
    if (ans==-1)
        return -1;
    return ans;

}


int main()
{
   f>>n>>m;
   char c;
   for (int i=1;i<=n;++i)
       for (int j=1;j<=m;++j)
       {
           f>>c;
           if (c=='*') //perete
           {
               mp[i][j]=-1;
               ch[i][j]=1;
           }
           else if (c=='D')
           {
              // mp[i][j]=-2;
               coada.push(make_pair(i,j));
               ch[i][j]=1;
           }
           else if (c=='I')
               start=(make_pair(i,j));
           else if (c=='O')
               finish=(make_pair(i,j));

       }

   lee();
   g<< bin()<<'\n';
   return 0;

}