Cod sursa(job #420397)

Utilizator ZillaMathe Bogdan Zilla Data 18 martie 2010 23:06:10
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.54 kb
#include <stdio.h>

#define Nmax 1024

int viz[Nmax][Nmax],ver[Nmax][Nmax],n,m,dx[4]={-1,0,0,1},dy[4]={0,-1,1,0},st,dr,sl,sc,fl,fc,fin;
char a[Nmax][Nmax];

struct coada{
    int x,y;
};

coada q[Nmax*Nmax];

int verifica(int mid)
{
    int i,j,stanga=0,dreapta=0;
    if(viz[sl][sc]>=mid )
        {
            q[++dreapta].x=sl;
            q[dreapta].y=sc;
        }
    else
        return 1;

    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            if(a[i][j]=='.')
                ver[i][j]=0;
            else
                ver[i][j]=1;
    ver[fl][fc]=0;
    while(stanga<dreapta)
        {
            ++stanga;
            int x=q[stanga].x;
            int y=q[stanga].y;
            for(i=0;i<4;++i)
                if(viz[x+dx[i]][y+dy[i]]>=mid && !ver[x+dx[i]][y+dy[i]])
                    {
                        q[++dreapta].x=x+dx[i];
                        q[dreapta].y=y+dy[i];
                        ver[x+dx[i]][y+dy[i]]=1;
                    }
        }
    if(ver[fl][fc])
        return 0;
    return 1;
}

int main()
{
    int i,j;

    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    scanf("%d%d\n",&n,&m);

    for(i=1;i<=n;++i)
        {
            for(j=1;j<=m;++j)
                {
                    scanf("%c",&a[i][j]);
                        if(a[i][j]=='D')
                            {
                                viz[i][j]=1;
                                q[++dr].x=i;
                                q[dr].y=j;
                            }
                        else
                            if(a[i][j]=='*')
                                viz[i][j]=-1;
                            else
                                if(a[i][j]=='I')
                                    {
                                        sl=i;
                                        sc=j;
                                    }
                                else
                                    if(a[i][j]=='O')
                                        {
                                            fl=i;
                                            fc=j;
                                        }
                }
            scanf("\n");
        }
    for(i=1;i<=n;++i)
        viz[i][0]=viz[i][m+1]=ver[i][0]=ver[i][m+1]=1;

    for(i=1;i<=m;++i)
        viz[0][i]=viz[n+1][i]=ver[0][i]=ver[n+1][i]=1;
    while(st<dr)
        {
            ++st;
            int x=q[st].x;
            int y=q[st].y;
            for(i=0;i<4;++i)
                if(!viz[x+dx[i]][y+dy[i]])
                    {
                        viz[x+dx[i]][y+dy[i]]=viz[x][y]+1;
                        q[++dr].x=x+dx[i];
                        q[dr].y=y+dy[i];
                    }
        }

    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j)
            if(viz[i][j])
                --viz[i][j];

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

    st=1;
    dr=n*m;

    while(st<dr)
        {
            //printf("%d %d\n",st,dr);
            int mid=(st+dr)/2;
            int ok =verifica(mid);
            if(ok)
                {
                    fin=mid;
                    dr=mid-1;
                }
            else
                st=mid+1;
            //printf("%d %d %d\n",st,dr,fin);
            //printf("\n\n\n");
        }

    if(!verifica(st))
        fin=st;

    printf("%d\n",fin);

    return 0;
}