Cod sursa(job #3319257)

Utilizator VladStroicaStroica Vlad Cristian VladStroica Data 31 octombrie 2025 14:05:07
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.62 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,nrdrag,nr=0,poz1,poz2,fin1,fin2;
int v[4005][4005];
bool vf[4005][4005];
struct cows
{
    int a,b;
};
cows dragoni[1000005];
cows lista[1000005];
void Func(int z)
{
    if(z<nr)
    {
        int x=lista[z].a;
        int y=lista[z].b;
        if(x-1>0 && v[x-1][y]==0 && vf[x-1][y]!=true)
        {
            v[x-1][y]=1;
            lista[nr].a=x-1;
            lista[nr].b=y;
            nr++;
        }
        if(y-1>0 && v[x][y-1]==0 && vf[x][y-1]!=true)
        {
            v[x][y-1]=1;
            lista[nr].a=x;
            lista[nr].b=y-1;
            nr++;
        }
        if(x+1<=n && v[x+1][y]==0 && vf[x+1][y]!=true)
        {
            v[x+1][y]=1;
            lista[nr].a=x+1;
            lista[nr].b=y;
            nr++;
        }
        if(y+1<=m && v[x][y+1]==0  && vf[x][y+1]!=true)
        {
            v[x][y+1]=1;
            lista[nr].a=x;
            lista[nr].b=y+1;
            nr++;
        }
        Func(z+1);
    }
}
bool Vf(int y)
{
    y-=2;
    if(y>=0)
    {
        for(int i=0; i<nrdrag; i++)
        {
            int x=dragoni[i].a;
            int z=dragoni[i].b;
            int x1=x-y;
            if(x1<1)
                x1=1;
            int z1=z-y;
            if(z1<1)
                z1=1;
            int x2=x+y+1;
            int z2=z+y+1;
            v[x1][z1]+=-1;
            v[x2][z2]+=-1;
            v[x1][z2]+=1;
            v[x2][z1]+=1;
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
                v[i][j]+=v[i-1][j]+v[i][j-1]-v[i-1][j-1];
        }
    }
       // for(int i=1; i<=n; i++)
   // {

       // for(int j=1; j<=m; j++)
        //{
            //cout<<v[i][j]<<" ";
            //v[i][j]=0;
       // }
       // cout<<endl;

   // cout<<endl;
    y+=1;
    for(int i=0; i<nrdrag; i++)
    {
        int x=dragoni[i].a;
        int z=dragoni[i].b;
        v[x][z]=-1;
        if(y>=0)
        {

            if(x-y>0)
            {
                v[x-y][z]=-1;
            }
            if(z-y>0)
            {
                v[x][z-y]=-1;
            }
            v[x+y][z]=-1;
            v[x][z+y]=-1;
        }
        }
    nr=0;
    lista[nr].a=poz1;
    lista[nr].b=poz2;
    nr++;
    Func(0);
    int ok=0;
    if(v[fin1][fin2]==1)
        ok++;
    for(int i=1; i<=n; i++)
    {

        for(int j=1; j<=m; j++)
        {
           // cout<<v[i][j]<<" ";
            v[i][j]=0;
        }
       // cout<<endl;
    }
   // cout<<endl;
    if(ok==0)
        return false;
    return true;
}


signed main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            char a;
            cin>>a;
            if(a=='*')
            {
                vf[i][j]=true;
            }
            else if(a=='D')
            {
                dragoni[nrdrag].a=i;
                dragoni[nrdrag].b=j;
                nrdrag++;

            }
            else if(a=='I')
            {
                poz1=i;
                poz2=j;
            }
            else if(a=='O')
            {
                fin1=i;
                fin2=j;
            }
        }
    }
    int st=0,dr=max(n,m);
    while(dr-st>1)
    {
        int mij=(st+dr)/2;
        if(Vf(mij)==true)
            st=mij;
        else
            dr=mij;
    }
    if(Vf(st)==true)
        cout<<st;
    else
        cout<<-1;
    return 0;
}