Cod sursa(job #1329459)

Utilizator ASTELOTudor Enescu ASTELO Data 29 ianuarie 2015 15:27:56
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<cstdio>
struct eu{int x,y,val;};
eu v[1000001];
struct eu2{int x,y;};
eu vc[1000001];
char a[1001][1001],c,b[1001][1001];
int i,j,n,m,h,l1,l2,mid,in,sf,x1,x2,y1,y2,o;
int lc,cc,linie[]={1,0,-1,0},coloana[]={0,-1,0,1};
int main ()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d%c",&n,&m,&c);
for(i=1;i<=n;i++)
    {
    for(j=1;j<=m;j++)
        {
        scanf("%c",&a[i][j]);
        if(a[i][j]=='I')
            {
            x1=i;
            y1=j;
            }
        if(a[i][j]=='O')
            {
            x2=i;
            y2=j;
            }
        }
    scanf("%c",&c);
    }
l1=1;
l2=n*m;
while(l1<=l2)
    {
    mid=(l1+l2)/2;
    in=1;
    sf=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            b[i][j]=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            {
            if(a[i][j]=='D')
                {
                sf++;
                v[sf].x=i;
                v[sf].y=j;
                v[sf].val=mid-1;
                b[i][j]='*';
                }
            if(a[i][j]=='*')
                b[i][j]='*';
            }
    while(in<=sf)
        {
        b[v[in].x][v[in].y]='*';
        if(v[in].val!=0)
            for(i=0;i<4;i++)
                {
                lc=v[in].x+linie[i];
                cc=v[in].y+coloana[i];
                if(lc>=1&&lc<=n&&cc>=1&&cc<=m&&b[lc][cc]==0)
                    {
                    b[lc][cc]='*';
                    sf++;
                    v[sf].x=lc;
                    v[sf].y=cc;
                    v[sf].val=v[in].val-1;
                    }
                }
        in++;
        }
    in=sf=1;
    vc[1].x=x1;
    vc[1].y=y1;
    b[x1][y1]=1;
    int pp=0;
    while(in<=sf)
        {
        for(i=0;i<4;i++)
            {
            lc=vc[in].x+linie[i];
            cc=vc[in].y+coloana[i];
            if(b[x2][y2]==0&&lc==x2&&cc==y2)
                {
                pp=1;
                in=sf+1;
                break;
                }
            if(lc>=1&&cc>=1&&lc<=n&&cc<=m&&b[lc][cc]==0)
                {
                sf++;
                b[lc][cc]=1;
                vc[sf].x=lc;
                vc[sf].y=cc;
                }
            }
        in++;
        }
    if(pp==1)
        {
        o=mid;
        l1=mid+1;
        }
    else
        l2=mid-1;
    }
printf("%d",o);
return 0;
}