Cod sursa(job #829093)

Utilizator assa98Andrei Stanciu assa98 Data 4 decembrie 2012 20:58:52
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.32 kb
#include <stdio.h>
#include<string.h>

int n,m;
char x[1010][1010];

int d[1010][1010];
int b[1010][1010];


struct sp
{
    int l;
    int c;
} c[2000000],s,f;
int st,sf;
int md;

int inborder(int l,int c)
{
    if(l<1||l>n)
        return 0;
    if(c<1||c>m)
        return 0;
    return 1;
}

void lee_d()
{
    st=1;
    while(st<=sf)
    {
        if(d[c[st].l][c[st].c]>md)
            md=d[c[st].l][c[st].c];

        if(inborder(c[st].l+1,c[st].c))
        {
            if(!d[ c[st].l + 1 ][ c[st].c ] && x[c[st].l + 1][c[st].c]!='*')
            {
                c[++sf].l=c[st].l + 1;
                c[sf].c=c[st].c;
                d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
            }
        }
        if(inborder(c[st].l-1,c[st].c))
        {
            if(!d[ c[st].l - 1 ][ c[st].c ] && x[c[st].l - 1][c[st].c]!='*')
            {
                c[++sf].l=c[st].l - 1;
                c[sf].c=c[st].c;
                d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
            }
        }
        if(inborder(c[st].l,c[st].c+1))
        {
            if(!d[ c[st].l ][ c[st].c + 1 ] && x[c[st].l ][c[st].c+1]!='*')
            {
                c[++sf].l=c[st].l;
                c[sf].c=c[st].c+1;
                d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
            }
        }
        if(inborder(c[st].l,c[st].c-1))
        {
            if(!d[ c[st].l ][ c[st].c - 1 ] && x[c[st].l ][c[st].c-1]!='*')
            {
                c[++sf].l=c[st].l;
                c[sf].c=c[st].c-1;
                d[c[sf].l][c[sf].c]=d[c[st].l][c[st].c]+1;
            }
        }
        st++;
    }
}

int drum(int x)
{
    if(d[s.l][s.c]<x+1)
        return 0;

    while(st<=sf)
    {
        if(c[st].l==f.l&&c[st].c==f.c)
            return 1;

        if(inborder(c[st].l+1,c[st].c))
        {
            if(!b[ c[st].l + 1 ][ c[st].c ] && d[c[st].l + 1][c[st].c]>=x+1)
            {
                c[++sf].l=c[st].l + 1;
                c[sf].c=c[st].c;
                b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
            }
        }
        if(inborder(c[st].l-1,c[st].c))
        {
            if(!b[ c[st].l - 1 ][ c[st].c ] && d[c[st].l - 1][c[st].c]>=x+1)
            {
                c[++sf].l=c[st].l - 1;
                c[sf].c=c[st].c;
                b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
            }
        }
        if(inborder(c[st].l,c[st].c+1))
        {
            if(!b[ c[st].l ][ c[st].c + 1 ] && d[c[st].l ][c[st].c+1]>=x+1)
            {
                c[++sf].l=c[st].l;
                c[sf].c=c[st].c+1;
                b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
            }
        }
        if(inborder(c[st].l,c[st].c-1))
        {
            if(!b[ c[st].l ][ c[st].c - 1 ] && d[c[st].l ][c[st].c-1]>=x+1)
            {
                c[++sf].l=c[st].l;
                c[sf].c=c[st].c-1;
                b[c[sf].l][c[sf].c]=b[c[st].l][c[st].c]+1;
            }
        }
        st++;
    }
    return 0;
}


int rez=-1;

void bs(int start,int final)
{
    if(start>final)
        return;

    int mij=(start+final)/2;

    memset(c,0,sizeof(c));
    memset(b,0,sizeof(b));
    c[1]=s;
    st=1;
    sf=1;
    int a=drum(mij);

    if(!a)
        bs(start,mij-1);
    else
    {
        if(mij>rez)
            rez=mij;
        bs(mij+1,final);
    }
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d%c",&n,&m,&x[0][0]);
    for(int i=1;i<=n;i++)
    {
        x[i][0]=' ';
        gets(x[i]+1);
        for(int j=1;j<=m;j++)
            if(x[i][j]=='I')
            {
                s.l=i;
                s.c=j;
                x[i][j]='.';
            }
            else if(x[i][j]=='O')
            {
                f.l=i;
                f.c=j;
                x[i][j]='.';
            }
            else if(x[i][j]=='D')
            {
                c[++sf].l=i;
                c[sf].c=j;
                x[i][j]='.';
                d[i][j]=1;
            }
    }

    lee_d();
 //   printf("%d\n",md);

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