Cod sursa(job #982097)

Utilizator thewildnathNathan Wildenberg thewildnath Data 8 august 2013 15:09:33
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.42 kb
#include<stdio.h>
#include<stack>

typedef struct punct
{
    int x,y;
}punct;

punct q[2000100],aux,I,O;
char v[1002][1002];

int n,m,st=1,sf,d[1002][1002],sol[1002][1002];

inline int min(int a,int b)
{return a<b?a:b;}

void fill()
{
    int k;
    while(st<=sf)
    {
        aux=q[st];
        ++st;
        k=d[aux.x][aux.y];
        if(v[aux.x+1][aux.y]=='.'&&(d[aux.x+1][aux.y]==0||d[aux.x+1][aux.y]>k+1))
        {
            ++sf;
            q[sf].x=aux.x+1;
            q[sf].y=aux.y;
            d[q[sf].x][q[sf].y]=k+1;
        }
        if(v[aux.x][aux.y+1]=='.'&&(d[aux.x][aux.y+1]==0||d[aux.x][aux.y+1]>k+1))
        {
            ++sf;
            q[sf].x=aux.x;
            q[sf].y=aux.y+1;
            d[q[sf].x][q[sf].y]=k+1;
        }
        if(v[aux.x-1][aux.y]=='.'&&(d[aux.x-1][aux.y]==0||d[aux.x-1][aux.y]>k+1))
        {
            ++sf;
            q[sf].x=aux.x-1;
            q[sf].y=aux.y;
            d[q[sf].x][q[sf].y]=k+1;
        }
        if(v[aux.x][aux.y-1]=='.'&&(d[aux.x][aux.y-1]==0||d[aux.x][aux.y-1]>k+1))
        {
            ++sf;
            q[sf].x=aux.x;
            q[sf].y=aux.y-1;
            d[q[sf].x][q[sf].y]=k+1;
        }
    }
}

void lee()
{
    int k;
    while(st<=sf)
    {
        aux=q[st];
        ++st;
        k=sol[aux.x][aux.y];
        if(v[aux.x+1][aux.y]=='.'&&(sol[aux.x+1][aux.y]==0||sol[aux.x+1][aux.y]<k))
        {
            ++sf;
            q[sf].x=aux.x+1;
            q[sf].y=aux.y;
            sol[q[sf].x][q[sf].y]=min(k,d[q[sf].x][q[sf].y]);
        }
        if(v[aux.x][aux.y+1]=='.'&&((sol[aux.x][aux.y+1]==0||sol[aux.x][aux.y+1]<k)))
        {
            ++sf;
            q[sf].x=aux.x;
            q[sf].y=aux.y+1;
            sol[q[sf].x][q[sf].y]=min(k,d[q[sf].x][q[sf].y]);
        }
        if(v[aux.x-1][aux.y]=='.'&&((sol[aux.x-1][aux.y]==0||sol[aux.x-1][aux.y]<k)))
        {
            ++sf;
            q[sf].x=aux.x-1;
            q[sf].y=aux.y;
            sol[q[sf].x][q[sf].y]=min(k,d[q[sf].x][q[sf].y]);
        }
        if(v[aux.x][aux.y-1]=='.'&&((sol[aux.x][aux.y-1]==0||sol[aux.x][aux.y-1]<k)))
        {
            ++sf;
            q[sf].x=aux.x;
            q[sf].y=aux.y-1;
            sol[q[sf].x][q[sf].y]=min(k,d[q[sf].x][q[sf].y]);
        }
    }
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j;
    scanf("%d%d\n",&n,&m);
    for(i=0;i<n;++i)
        scanf("%s\n",v[i]);

    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            if(v[i][j]=='.')
                continue;
            if(v[i][j]=='D')
            {
                aux.x=i;aux.y=j;
                q[++sf]=aux;
            }
            else if(v[i][j]=='I')
            {I.x=i;I.y=j;v[i][j]='.';}
            else if(v[i][j]=='O')
            {O.x=i;O.y=j;v[i][j]='.';}

        }
    }
    //////////////////////////
    fill();

    sf=st=1;
    q[sf]=I;
    sol[q[sf].x][q[sf].y]=d[q[sf].x][q[sf].y];

    lee();


    if(sol[O.x][O.y])
        printf("%d\n",sol[O.x][O.y]);
    else
        printf("-1\n");

    /*for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
            printf("%d ",d[i][j]);
        printf("\n");
    }
    printf("\n");
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
            printf("%d ",sol[i][j]);
        printf("\n");
    }*/
    return 0;
}