Cod sursa(job #1536180)

Utilizator Iustin48Ventaniuc Iustin Iustin48 Data 25 noiembrie 2015 20:13:17
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char c;
int maxim,sol,log,poz,AUX[1001][1001],prim,ultim,n,m,A[1001][1001],lf,cf,li,ci,urml,urmc,dl[4]={-1,0,1,0},dc[4]={0,1,0,-1};
struct coada {int l,c;} V[1000001];
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        {
            f>>c;
            switch(c)
            {
                case '*' :
                    A[i][j]=-1;
                    break;
                case 'O' :
                    A[i][j]=-2;
                    lf=i;
                    cf=j;
                    break;
                case 'I' :
                    A[i][j]=-2;
                    li=i;
                    ci=j;
                    break;
                case 'D' :
                    V[++ultim].l=i;
                    V[ultim].c=j;
                    break;
                case '.' :
                    A[i][j]=-2;
                    break;
            }

        }
    prim=1;
    while(prim<=ultim)
    {
        for(int dr=0;dr<4;++dr)
        {
            urml=V[prim].l+dl[dr];
            urmc=V[prim].c+dc[dr];
            if(A[urml][urmc]==-2)
            {
                A[urml][urmc]=A[V[prim].l][V[prim].c]+1;
                V[++ultim].l=urml;
                V[ultim].c=urmc;
            }
        }
        ++prim;
    }
   /* for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
            g<<A[i][j]<<' ';
        g<<'\n';
    }
    */
    maxim=A[V[ultim].l][V[ultim].c];
    sol=-1;
    for(log=1;log<=maxim;log<<=1);
    for(;log;log>>=1)
    {
        if(A[li][ci]>=poz+log)
        {
            prim=ultim=1;
            V[prim].l=li;
            V[prim].c=ci;
            int w=1;
            memset(AUX,0,(n+1)*(m+1));
            AUX[li][ci]=1;
            while(prim<=ultim&&w)
            {
                if(V[prim].l==lf&&V[prim].c==cf)
                {
                    poz+=log;
                    sol=poz;
                    w=0;
                }
                else
                {
                    for(int dr=0;dr<4;++dr)
                    {
                        if(V[prim].l+dl[dr]<=n&&V[prim].l+dl[dr]>=1&&V[prim].c+dc[dr]<=m&&V[prim].c+dc[dr]>=1)
                        {
                            urml=V[prim].l+dl[dr];
                            urmc=V[prim].c+dc[dr];
                            if((A[urml][urmc]!=-1)&&(A[urml][urmc]>=(poz+log))&&(!AUX[urml][urmc]))
                            {
                                V[++ultim].l=urml;
                                V[ultim].c=urmc;
                                AUX[urml][urmc]=1;
                            }
                        }
                    }
                }
                ++prim;
            }
        }
    }
    g<<sol;
    return 0;
}