Cod sursa(job #1133687)

Utilizator heracleRadu Muntean heracle Data 5 martie 2014 12:38:26
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <cstdio>
#include <queue>
#include <cstring>

const int Q=1002;

int v[Q][Q];
int l,c;
int sx,sy,fx,fy;
std::queue<int> a,b;
int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};

int max;

bool trec[Q][Q];

void clean()
{
    for(int i=1; i<=l; i++)
        memset(trec[i],0,sizeof trec[i]);
}

bool drum(int dist)
{
    a.push(sx);
    b.push(sy);
    int size,kx,ky,pas=0;

    while(a.size()!=0)
    {
        size=a.size();
        for(int i=1; i<=size; i++)
        {
            kx=a.front();
            ky=b.front();
            a.pop();
            b.pop();

            for(int k=1; k<=4; k++)
            {
                if(v[kx+dx[k]][ky+dy[k]]>=dist && trec[kx+dx[k]][ky+dy[k]]==0 )
                {
                    trec[kx+dx[k]][ky+dy[k]]=1;
                    a.push(kx+dx[k]);
                    b.push(ky+dy[k]);
                    if(kx+dx[k]==fx && ky+dy[k]==fy)
                    {
                        while(a.size())
                        {
                            a.pop();
                            b.pop();
                        }
                        return 0;
                    }

                }
            }
        }
    }
    return 1;
}

int minim(int q, int w)
{
    if(q<w)
        return q;
    return w;
}

void make_dragon(int x, int y)
{
    a.push(x);
    b.push(y);

    int size,kx,ky,pas=0;

    while(a.size()!=0)
    {
        size=a.size();
        pas++;
        for(int i=1; i<=size; i++)
        {
            kx=a.front();
            ky=b.front();
            a.pop();
            b.pop();

            for(int k=1; k<=4; k++)
            {
                if(v[kx+dx[k]][ky+dy[k]]>pas || v[kx+dx[k]][ky+dy[k]]==0 && v[kx+dx[k]][ky+dy[k]]!=-1)
                {
                    v[kx+dx[k]] [ky+dy[k]]=pas;
                    a.push(kx+dx[k]);
                    b.push(ky+dy[k]);
                }
            }
        }
    }
}


int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    scanf("%d %d\n",&l,&c);

    char h;

    for(int i=1; i<=l; i++)
    {
        v[i][0]=-1;
        v[i][c+1]=-1;
    }
    for(int j=1; j<=c; j++)
    {
        v[0][j]=-1;
        v[l+1][j]=-1;
    }

    for(int i=1; i<=l; i++)
    {
        for(int j=1; j<=c; j++)
        {
            scanf("%c",&h);

            if(h=='I')
            {
                sx=i;
                sy=j;
            }
            if(h=='O')
            {
                fx=i;
                fy=j;
            }
            if(h=='D')
            {
                make_dragon(i,j);
            }
            if(h=='*')
            {
                v[i][j]=-1;
            }
        }
        scanf("\n");
    }
/*
    for(int i=0; i<=l+1; i++)
    {
        for(int j=0; j<=c+1; j++)
            printf("%d\t",v[i][j]);
        printf("\n");
    }
*/

    int pas=1<<11,t=0;

    while(pas)
    {
        if(drum(pas+t)==0)
        {
            t=pas;
        }
        clean();
        pas/=2;
    }
    int i;

    if(t==0 && drum(0)==1)
        t=-1;

    printf("%d",t);

    return 0;
}