Cod sursa(job #371119)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 3 decembrie 2009 21:16:14
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.79 kb
#include<stdio.h>
#define DIM 1005
struct coada
{
    int x,y;
} c[DIM*DIM],r;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int a[DIM][DIM],b[DIM][DIM],x1,x2,y1,y2,n,m;
void show ()
{
    int i,j;
    for(i=1;i<=n;++i,printf("\n"))
        for(j=1;j<=m;++j)
            printf("%d ",a[i][j]);
        printf("\n");
    for(i=1;i<=n;++i,printf("\n"))
        for(j=1;j<=m;++j)
            printf("%d ",b[i][j]);
        printf("\n");
}
int check (int x)
{
    int st=1,dr=1,i;
    c[st].x=x1,c[st].y=y1;
    while(st<=dr)
    {
        r=c[st];
        for(i=0;i<4;++i)
            if(b[r.x+dx[i]][r.y+dy[i]]>=x+1 && a[r.x+dx[i]][r.y+dy[i]]==0)
            {
                a[r.x+dx[i]][r.y+dy[i]]=1;
                c[++dr].x=r.x+dx[i];
                c[dr].y=r.y+dy[i];
            }
        ++st;
    }
    if(a[x2][y2]==1)
        return 1;
    return 0;
}
int maxim (int a,int b)
{
    if(a>b)
        return b;
    return a;
}
int main ()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j,st=1,dr=0,max=0;
    char ch;
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;++i,scanf("\n"))
        for(j=1;j<=m;++j)
        {
            scanf("%c",&ch);
            if(ch=='*')
                a[i][j]=b[i][j]=-2;
            if(ch=='D')
            {
                a[i][j]=-1;
                b[i][j]=1;
                c[++dr].x=i;
                c[dr].y=j;
            }
            else if (ch=='I')
                    x1=i,y1=j;
                else if (ch=='O')
                        x2=i,y2=j;
        }
    for(i=0;i<=n+1;++i)
        a[i][0]=a[i][m+1]=b[i][0]=b[i][m+1]=-1;
    for(i=0;i<=m+1;++i)
        a[0][i]=a[n+1][i]=b[0][i]=b[n+1][i]=-1;
    while(st<=dr)
    {
        r=c[st];
        for(i=0;i<4;++i)
            if(b[r.x+dx[i]][r.y+dy[i]]==0)
            {
                b[r.x+dx[i]][r.y+dy[i]]=b[r.x][r.y]+1;
                c[++dr].x=r.x+dx[i];
                c[dr].y=r.y+dy[i];
            }
        ++st;
    }
    c[st=1].x=x1;
    c[dr=1].y=y1;
    while(st<=dr)
    {
        r=c[st];
        for(i=0;i<4;++i)
            if(a[r.x+dx[i]][r.y+dy[i]]==0)
            {
                a[r.x+dx[i]][r.y+dy[i]]=a[r.x][r.y]+1;
                c[++dr].x=r.x+dx[i];
                c[dr].y=r.y+dy[i];
            }
        ++st;
    }
    if(a[x2][y2]==0)
    {
        printf("-1");
        return 0;
    }
    st=0,dr=n+m;
    int mij;
    max=b[x1][y1];
    while(st<=dr)
    {
        for(i=1;i<=n;++i)
            for(j=1;j<=m;++j)
                if(a[i][j]>0)
                    a[i][j]=0;
        mij=(st+dr)/2;
        if(check(mij))
            max=maxim(max,mij),st=mij+1;
        else
            dr=mij-1;
    }
    printf("%d",max+1);
    return 0;
}