Cod sursa(job #419845)

Utilizator MKLOLDragos Ristache MKLOL Data 18 martie 2010 02:41:33
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include<algorithm>
using namespace std;
#define Nmax 1510
struct cod{int x, y;} l[Nmax*Nmax],start,fin;
int cost[Nmax][Nmax],N,M,st,dr,k=1,cdr,cst,mij,ok,rez;
char v[Nmax][Nmax];
int rec[Nmax][Nmax];
char dx[5]={0,1,-1,0,0};
char dy[5]={0,0,0,1,-1};
int ver(int x,int y)
{
    if(x>N||x<1)
    return 0;
    if(y>M||y<1)
    return 0;
    if(v[x][y]==0)
    return 0;
    if(cost[x][y]!=0)
    return 0;
    return 1;
}


int ver2(int x,int y)
{
    if(x>N||x<1)
    return 0;
    if(y>M||y<1)
    return 0;
    if(v[x][y]==0)
    return 0;

    return 1;
}



void make_magic(int x,int y)
{
    for(int i=1;i<=4;++i)
    if(ver(x+dx[i],y+dy[i]))
    {
        cost[x+dx[i]][y+dy[i]]=cost[x][y]+1;
        l[dr].x=x+dx[i];
        l[dr].y=y+dy[i];
        ++dr;
    }
}
void afis()
{
    for(int i=1;i<=N;++i)
    {
        for(int j=1;j<=M;++j)
            printf("%d ",cost[i][j]);
    printf("\n");
    }
}
int fill()
{
st=0;
dr=1;
int x,y;
while(st<dr&&rec[fin.x][fin.y]!=k)
{
    x=l[st].x;
    y=l[st].y;
    rec[x][y]=k-1;

    for(int i=1;i<=4;++i)
    {
        if(ver2(x+dx[i],y+dy[i]))
        {

            if(rec[x+dx[i]][y+dy[i]]!=k)
            {

                if(cost[x+dx[i]][y+dy[i]]>=mij)
                {

                    l[dr].x=x+dx[i];
                    l[dr].y=y+dy[i];
                    ++dr;
                    rec[x+dx[i]][y+dy[i]]=k;
                }
            }
        }


    }
++st;
}

    if(rec[fin.x][fin.y]==k)
    return 1;
return 0;

}

int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&N,&M);
for(int i=1;i<=N;++i)
    {
    for(int j=1;j<=M;++j)
        {
        scanf("%c",&v[i][j]);
        if(v[i][j]=='D')
        {cost[i][j]=1;
            l[dr].x=i;
            l[dr].y=j;
            ++dr;
        }
        if(v[i][j]=='I')
        {
            start.x=i;
            start.y=j;
        }
        if(v[i][j]=='*')
        v[i][j]=0;

        if(v[i][j]=='O')
        {
            fin.x=i;
            fin.y=j;
        }
        }

        scanf("\n");
    }

    while(st<dr)
    {
        make_magic(l[st].x,l[st].y);
        ++st;
    }
    l[0].y=start.x;
    l[0].x=start.y;
    rec[start.x][start.y]=1;
    cdr=min(cost[start.x][start.y],cost[fin.x][fin.y]);
    cst=1;

    while(cst<=cdr)
    { l[0].x=start.x;
    l[0].y=start.y;
        mij=(cst+cdr)/2;
        //printf("%d %d %d\n",cst,cdr,mij);
        ok=fill();
     //printf("%d\n",k);
        if(ok)
        {
            rez=mij;
            cst=mij+1;
        }
        else
        {
            cdr=mij-1;
        }
       // afis();
        ++k;
    }

printf("%d",rez-1);


}