Cod sursa(job #414607)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 10 martie 2010 12:12:16
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include<cstdio>
struct punct
{
    int lin,col;
};
const int N=1<<10;
int R,C,m[N][N],matr[N][N];
char a[N][N];
int dl[]={0,1,0,-1};
int dc[]={-1,0,1,0};
punct fin,inc,coada[N*N];
void lee1()
{
    int i,j,u=0;
    punct x,y;
    for(i=1;i<=R;i++)
        for(j=1;j<=C;j++)
            if(a[i][j]=='D')
            {
                coada[u].lin=i;
                coada[u].col=j;
                u++;
            }
    for(i=0;i<u;i++)
    {
        x.lin=coada[i].lin;
        x.col=coada[i].col;
        for(j=0;j<4;j++)
            if(m[x.lin+dl[j]][x.col+dc[j]]==0 && (a[x.lin+dl[j]][x.col+dc[j]]=='.' || a[x.lin+dl[j]][x.col+dc[j]]=='I' ||  a[x.lin+dl[j]][x.col+dc[j]]=='O'))
            {
                y.lin=x.lin+dl[j];
                y.col=x.col+dc[j];
                m[y.lin][y.col]=m[x.lin][x.col]+1;
                coada[u]=y;
                u++;
            }
    }
}
int lee(int POQ)
{
    int i,j,u=0;
    punct x,y;
    coada[u++]=inc;
    if(m[inc.lin][inc.col]<POQ)
        return 0;
    for(i=1;i<=R;i++)
        for(j=1;j<=C;j++)
            matr[i][j]=0;
    for(i=0;i<u;i++)
    {
        x.lin=coada[i].lin;
        x.col=coada[i].col;
        for(j=0;j<4;j++)
            if(matr[x.lin+dl[j]][x.col+dc[j]]==0 && m[x.lin+dl[j]][x.lin+dc[j]]>=POQ)
            {
                y.lin=x.lin+dl[j];
                y.col=x.col+dc[j];
                matr[y.lin][y.col]=matr[x.lin][x.col]+1;
                coada[u]=y;
                u++;
            }
    }
    if(matr[fin.lin][fin.col]!=0)
        return 1;
    return 0;
}
int bordare()
{
    int i,j;
    for(i=0;i<=R;i++)
        m[i][0]=m[i][C+1]=-1;
    for(j=0;j<=C;j++)
        m[0][j]=m[R+1][j]=-1;
    for(i=1;i<=R;i++)
        for(j=1;j<=C;j++)
            if(a[i][j]=='*')
                m[i][j]=-1;
}
int cautb()
{
    bordare();
    int i=0,pas=1<<11;
    for(i=0;pas;pas>>=1)
        if(lee(i+pas))
            i+=pas;
    return i;
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&R,&C);
    for(int i=1;i<=R;i++)
        gets(a[i]+1);
    for(int i=1;i<=R;i++)
        a[i][0]=a[i][C+1]='*';
    for(int j=1;j<=C;j++)
        a[0][j]=a[R+1][j]='*';
    for(int i=1;i<=R;i++)
        for(int j=1;j<=C;j++)
        {
            if(a[i][j]=='I')
            {
                inc.lin=i;
                inc.col=j;
            }
            else if(a[i][j]=='O')
            {
                fin.lin=i;
                fin.col=j;
            }
        }
    lee1();
    printf("%d",cautb());
    return 0;
}