Cod sursa(job #2552805)

Utilizator BogauuuBogdan Ivancu Bogauuu Data 21 februarie 2020 11:14:31
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>

using namespace std;

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

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

int n,m,i,j,d,k,maxim,si,sj,fi,fj,st,dr,x,y,vx,vy,cl[1000005],cc[1000005],a[1005][1005],b[1005][1005];
char ch;

int main()
{
    fin >> n >> m;
    for (i=1;i<=n;i++) for (j=1;j<=m;j++)
    {
        fin >> ch;
        if (ch=='D')
        {
            dr++;
            cl[dr]=i;
            cc[dr]=j;
            b[i][j]=1;
        }
        if (ch=='*') a[i][j]=-1;
        if (ch=='I')
        {
            si=i;
            sj=j;
        }
        if (ch=='O')
        {
            fi=i;
            fj=j;
        }
    }
    st=1;
    while (st<=dr)
    {
        x=cl[st];
        y=cc[st];
        for (d=0;d<4;d++)
        {
            vx=x+di[d];
            vy=y+dj[d];
            if (vx>=1 && vx<=n && vy>=1 && vy<=m && b[vx][vy]==0 && a[i][j]!=-1)
            {
                b[vx][vy]=b[x][y]+1;
                dr++;
                cl[dr]=vx;
                cc[dr]=vy;
            }
        }
        st++;
    }
    for (d=0;d<4;d++)
    {
        x=si+di[d];
        y=sj+dj[d];
        maxim=max(maxim,b[x][y]);
    }
    for (k=maxim;k>1;k--)
    {
        st=1;
        dr=1;
        cl[1]=si;
        cc[1]=sj;
        a[si][sj]=k;
        while (st<=dr)
        {
            x=cl[st];
            y=cc[st];
            for (d=0;d<4;d++)
            {
                vx=x+di[d];
                vy=y+dj[d];
                if (vx>=1 && vx<=n && vy>=1 && vy<=m && a[vx][vy]!=k && a[vx][vy]!=-1 && b[vx][vy]>=k)
                {
                    a[vx][vy]=k;
                    dr++;
                    cl[dr]=vx;
                    cc[dr]=vy;
                    if (vx==fi && vy==fj)
                    {
                        fout << k-1;
                        return 0;
                    }
                }
            }
            st++;
        }
    }
    fout << -1;

    return 0;
}