Cod sursa(job #2133743)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 17 februarie 2018 11:22:58
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.98 kb
#include <fstream>

using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
long long vi[1000003],vj[1000003],v[1002][1002],cv[1002][1002],val[1000003];
int main()
{
    long long n,m,i,j,pas=1<<11,a,b,x,y,st=1,dr=0,k=0,ck=0,cdr,ok;
    char c;
    in>>n>>m>>ws;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            in>>c;
            if(c=='D')
            {
                dr++;
                vi[dr]=i;
                vj[dr]=j;
            }
            if(c=='I')
            {
                a=i;
                b=j;
            }
            if(c=='O')
            {
                x=i;
                y=j;
            }
            v[i][j]=cv[i][j]=-1;
            if(c=='*')
                v[i][j]=cv[i][j]=-2;
            if(c=='D')
                v[i][j]=cv[i][j]=1;
        }
    st=1;
    while(st<=dr)
    {
        if(v[vi[st]][vj[st]+1]!=-2 && v[vi[st]][vj[st]+1]!=0)
        {
            if(v[vi[st]][vj[st]+1]==-1 || v[vi[st]][vj[st]+1]>val[st]+1)
            {
                v[vi[st]][vj[st]+1]=val[st]+1;
                dr++;
                vi[dr]=vi[st];
                vj[dr]=vj[st]+1;
                val[dr]=val[st]+1;
            }
        }
        if(v[vi[st]][vj[st]-1]!=-2 && v[vi[st]][vj[st]-1]!=0)
        {
            if(v[vi[st]][vj[st]-1]==-1 || v[vi[st]][vj[st]-1]>val[st]+1)
            {
                v[vi[st]][vj[st]-1]=val[st]+1;
                dr++;
                vi[dr]=vi[st];
                vj[dr]=vj[st]-1;
                val[dr]=val[st]+1;
            }
        }
        if(v[vi[st]-1][vj[st]]!=-2 && v[vi[st]-1][vj[st]]!=0)
        {
            if(v[vi[st]-1][vj[st]]==-1 || v[vi[st]-1][vj[st]]>val[st]+1)
            {
                v[vi[st]-1][vj[st]]=val[st]+1;
                dr++;
                vi[dr]=vi[st]-1;
                vj[dr]=vj[st];
                val[dr]=val[st]+1;
            }
        }
        if(v[vi[st]+1][vj[st]]!=-2 && v[vi[st]+1][vj[st]]!=0)
        {
            if(v[vi[st]+1][vj[st]]==-1 || v[vi[st]+1][vj[st]]>val[st]+1)
            {
                v[vi[st]+1][vj[st]]=val[st]+1;
                dr++;
                vi[dr]=vi[st]+1;
                vj[dr]=vj[st];
                val[dr]=val[st]+1;
            }
        }
        st++;
    }
    for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
                cv[i][j]=v[i][j];
    while(pas)
    {
        ck+=pas;
        dr=cdr;
        st=dr=1;
        vi[st]=a;
        vj[st]=b;
        ok=0;
        v[vi[st]][vj[st]]=-2;
        while(st<=dr)
        {
            if(vi[st]==x && vj[st]==y)
            ok=1;
            if(v[vi[st]][vj[st]+1]!=-2 && v[vi[st]][vj[st]+1]!=0 && v[vi[st]][vj[st]+1]>=ck)
            {
                    v[vi[st]][vj[st]+1]=-2;
                    dr++;
                    vi[dr]=vi[st];
                    vj[dr]=vj[st]+1;
            }
            if(v[vi[st]][vj[st]-1]!=-2 && v[vi[st]][vj[st]-1]!=0 && v[vi[st]][vj[st]-1]>=ck)
            {
                    v[vi[st]][vj[st]-1]=-2;
                    dr++;
                    vi[dr]=vi[st];
                    vj[dr]=vj[st]-1;
            }
            if(v[vi[st]-1][vj[st]]!=-2 && v[vi[st]-1][vj[st]]!=0 && v[vi[st]-1][vj[st]]>=ck)
            {
                    v[vi[st]-1][vj[st]]=-2;
                    dr++;
                    vi[dr]=vi[st]-1;
                    vj[dr]=vj[st];
            }
            if(v[vi[st]+1][vj[st]]!=-2 && v[vi[st]+1][vj[st]]!=0 && v[vi[st]+1][vj[st]]>=ck)
            {
                    v[vi[st]+1][vj[st]]=-2;
                    dr++;
                    vi[dr]=vi[st]+1;
                    vj[dr]=vj[st];
            }
            st++;
        }
        if(ok==1)
            k=ck;
        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
                v[i][j]=cv[i][j];
        pas/=2;
        ck=k;
    }
    if(k)
    out<<k;
    else
    out<<-1;
    return 0;
}