Cod sursa(job #2627051)

Utilizator NoRules123Osadici Darius Bogdan NoRules123 Data 9 iunie 2020 14:53:20
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
char a[1001][1001];
int vis[1001][1001];
int dragon[1001][1001],sx,sy,fx,fy;
const int di[4]={1,0,-1,0};
const int dj[4]={0,1,0,-1};
queue<pair<int,int> > qd;
bool inside(int x,int y)
{
    if(x<1 || y<1 || x>n || y>m)return false;
    return true;
}
void lee_dragons()
{

    while(!qd.empty())
    {
        int x=qd.front().first;
        int y=qd.front().second;
        qd.pop();
        for(int k=0;k<4;k++)
        {
            int xnou=x+di[k];
            int ynou=y+dj[k];
            if(inside(xnou,ynou) && a[xnou][ynou]!='*' && dragon[xnou][ynou]>dragon[x][y]+1)
            {
                    dragon[xnou][ynou]=dragon[x][y]+1;
                    qd.push(make_pair(xnou,ynou));
            }
        }
    }
}
bool verif(int lim)
{
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)vis[i][j]=0;
   queue<pair<int,int> > q;
   if(dragon[sx][sy]>=lim)
   {
       vis[sx][sy]=1;
       q.push(make_pair(sx,sy));
   }
   while(!q.empty())
   {
       int x=q.front().first;
       int y=q.front().second;
       q.pop();
       for(int k=0;k<4;k++)
       {
           int xnou=x+di[k];
           int ynou=y+dj[k];
           if(inside(xnou,ynou) &&  a[xnou][ynou]!='*' && dragon[xnou][ynou]>=lim && !vis[xnou][ynou])
           {
               q.push(make_pair(xnou,ynou));
               vis[xnou][ynou]=1;
           }
       }
   }
   if(vis[fx][fy]==1)
    return true;
   else
    return false;
}
/*
void lee_jucator()
{
    while(!qp.empty())
    {
        int x=qp.front().first;
        int y=qp.front().second;
        qp.pop();
        for(int k=0;k<4;k++)
        {
            int xnou=x+di[k];
            int ynou=y+dj[k];
            if(inside(xnou,ynou) && a[xnou][ynou]==0 && dp[xnou][ynou]<min(dp[x][y],dragon[xnou][ynou]))
            {
                dp[xnou][ynou]=min(dp[x][y],dragon[xnou][ynou]);
                ///if(xnou==fx && ynou==fy)return;
                qp.push(make_pair(xnou,ynou));
            }
        }
    }
}
*/
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dragon[i][j]=INT_MAX;
            fin>>a[i][j];
            if(a[i][j]=='D')
            {
                dragon[i][j]=0;
                qd.push(make_pair(i,j));
            }
            else if(a[i][j]=='I')
            {
                sx=i;sy=j;

            }
            else if(a[i][j]=='O')
            {
                fx=i;fy=j;
            }
        }
    }
    lee_dragons();
    /*
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<dragon[i][j]<<" ";
        }
        cout<<'\n';
    }
    */
    long long st=0,dr=n*m,ans=-1;
    while(st<=dr)
    {
        long long  mij=(st+dr)/2;
        ///cout<<mij<<" ";
        bool f=verif(mij);
        if(f)
            ans=mij,st=mij+1;
        else
            dr=mij-1;

    }
    fout<<ans;

    return 0;
}