Cod sursa(job #906303)

Utilizator lianaliana tucar liana Data 6 martie 2013 18:39:04
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include<stdio.h>
#define nmax 1005
#define inf nmax*nmax
struct element{long l,c;};
long n, m, i, st, dr, mjc, nv, l1, l2, c1, c2, j, inc, sf, k, lac, cac;
long ma[nmax][nmax], viz[nmax][nmax];
element co[nmax*nmax], el;
bool ok;
char s[nmax];
long vl[5]={0,-1,0,0,1};
long vc[5]={0,0,-1,1,0};

void citire()
{
    scanf("%ld %ld",&n,&m);
    gets(s);
    for (i=1;i<=n;i++)
    {
        gets(s);
        for (j=1;j<=m;j++)
        {
            if (s[j-1]=='.')
                ma[i][j]=inf;
            if (s[j-1]=='*')
                ma[i][j]=-1;
            if (s[j-1]=='D')
            {
                co[++sf].l=i;   co[sf].c=j;
                ma[i][j]=0;
            }
            if (s[j-1]=='I')
            {   l1=i;   c1=j; ma[i][j]=inf;  }
            if (s[j-1]=='O')
            {   l2=i;   c2=j; ma[i][j]=inf;  }
        }
    }
}

void bordare()
{
    for (j=0;j<=m+1;j++)
        ma[0][j]=ma[n+1][j]=-inf;
    for (i=0;i<=n+1;i++)
        ma[i][0]=ma[i][m+1]=-inf;
}

void calculare()
{
    inc=1;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        for (k=1;k<=4;k++)
        {
            lac=el.l+vl[k]; cac=el.c+vc[k];
            if (ma[lac][cac]==inf)
            {
                co[++sf].l=lac; co[sf].c=cac;
                ma[lac][cac]=ma[el.l][el.c]+1;
            }
        }
    }
}

void verificare()
{
    nv++;
    inc=sf=1;
    co[1].l=l1; co[1].c=c1; viz[l1][c1]=nv;
    while (inc<=sf)
    {
        el=co[inc]; inc++;
        for (k=1;k<=4;k++)
        {
            lac=el.l+vl[k]; cac=el.c+vc[k];
            if ((ma[lac][cac]>=mjc)&&(viz[lac][cac]<nv))
            {
                co[++sf].l=lac; co[sf].c=cac;
                viz[lac][cac]=nv;
                if ((lac==l2)&&(cac==c2))
                {   inc=sf+5;   break;  }
            }
        }
    }
    ok=(viz[l2][c2]==nv);
}

void rezolvare()
{
    st=1;   dr=n*m;
    while (st<=dr)
    {
        mjc=(st+dr)/2;
        verificare();
        if (ok)
            st=mjc+1;
        else
            dr=mjc-1;
    }
    printf("%ld\n",dr);
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    citire();
    calculare();
    bordare();
   /* for (i=1;i<=n;i++)
    {
        for (j=1;j<=m;j++)
            printf("%ld ",ma[i][j]);
        printf("\n");
    }*/
    rezolvare();
    return 0;
}