Cod sursa(job #3319246)

Utilizator VladStroicaStroica Vlad Cristian VladStroica Data 31 octombrie 2025 13:19:22
Problema Barbar Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,nrdrag,nr=0,poz1,poz2,fin1,fin2;
int v[2005][2005];
bool vf[2005][2005];
struct cows
{
    int a,b;
};
cows dragoni[100005];
cows lista[100005];
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)
{
    for(int i=0;i<nrdrag;i++)
    {
        int x=dragoni[nrdrag].a;
        int z=dragoni[nrdrag].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];
    }
    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++)
        v[i][j]=0;
       if(ok==0)
       return false;
    return true;
}
int 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<<endl;
    else
        cout<<-1;
    return 0;
}