Cod sursa(job #1329448)

Utilizator ade_tomiEnache Adelina ade_tomi Data 29 ianuarie 2015 15:20:45
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include<stdio.h>
struct str
{
    int l,c;
    str(int ll=0,int cc=0)
    {
        l=ll;
        c=cc;
    }
};
int lin[]={0,0,-1,1};
int col[]={1,-1,0,0};
str q[1000*1000+3],start,stop;
char x;
int a[1004][1004],b[1004][1004],n,m,l1,l2,mid,in,sf,maxi,sol;
int main()
{
    int i,j;
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d ",&n,&m);
    for(i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]=-1;
    for(i=0;i<=m+1;i++)
        a[0][i]=a[n+1][i]=-1;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            scanf("%c ",&x);
            if(x=='D'){

                //a[i][j]=1;
                sf++;
                q[sf]=str(i,j);
            }
            if(x=='I')
                start=str(i,j);
            if(x=='*')
                a[i][j]=-1;
            if(x=='O')
                stop=str(i,j);
        }
    in=1;



    while(in<=sf)
    {
        for(int i=0;i<4;i++)
            if(a[q[in].l+lin[i]][q[in].c+col[i]]==0)
            {
                a[q[in].l+lin[i]][q[in].c+col[i]]=a[q[in].l][q[in].c]+1;
                sf++;
                if(a[q[in].l][q[in].c]+1>maxi)
                    maxi=a[q[in].l][q[in].c]+1;
                q[sf]=str(q[in].l+lin[i],q[in].c+col[i]);
            }
        in++;
    }
    l1=1;
    in=sf=1;
    q[in]=start;
    l2=maxi;


    while(l1<=l2)
    {
        for(int i=0;i<=n+1;i++)
            for(int j=0;j<=m+1;j++)
            {
                if(a[i][j]==-1)
                    b[i][j]=-1;
                else
                    b[i][j]=0;
            }
        in=sf=1;
        mid=(l1+l2)/2;
        b[start.l][start.c]=1;
        if(a[start.l][start.c]>=mid)
            while(in<=sf)
            {
                for(int i=0;i<4;i++)
                    if(a[q[in].l+lin[i]][q[in].c+col[i]]>=mid&&b[q[in].l+lin[i]][q[in].c+col[i]]==0&&a[q[in].l+lin[i]][q[in].c+col[i]]!=-1)
                    {
                        sf++;
                        q[sf]=str(q[in].l+lin[i],q[in].c+col[i]);
                        b[q[in].l+lin[i]][q[in].c+col[i]]=b[q[in].l][q[in].c]+1;
                    }
                in++;
            }
        if(b[stop.l][stop.c]!=0)
        {
            if(mid>sol);
                sol=mid;
            l1=mid+1;
        }
        else
            l2=mid-1;
    }
    printf("%d",sol);
    return 0;
}