Cod sursa(job #598318)

Utilizator elfusFlorin Chirica elfus Data 25 iunie 2011 13:46:02
Problema A+B Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 4.38 kb
// VA ROG IGNORATI SURSA. TESTEZ TIMPU DE EXECUTIE

#include<time.h>
#include<stdio.h>
#define minim(a,b) ((a) < (b) ? (a) : (b))
#define LMAX 1569
#define maxim(a,b) ((a) > (b) ? (a) : (b))
#include<queue>

short int n,m,x[LMAX][LMAX],f1[LMAX][LMAX],f2[LMAX][LMAX];
bool used[LMAX][LMAX];
struct pozdy
{
    short int x,y;
};

int dx[]={-1,0,1,0}, dy[]={0,1,0,-1};

using namespace std;

queue<pozdy> Q;

inline pozdy make_pozdy(int x0,int y0)
{
    pozdy aux;
    aux.x=x0;
    aux.y=y0;
    return aux;
}

void solve(pozdy aux,short int f[LMAX][LMAX])
{
    int i,j;
  /*  int i,cst;
    while(!Q.empty())
        Q.pop();
    Q.push(aux);
    while(!Q.empty())
    {
        aux=Q.front();
        for(i=aux.x;i>=1;i--)
        {
            cst=maxim(f[aux.x][aux.y]+1,x[i][aux.y]);
            if(f[i][aux.y]==0 || cst<f[i][aux.y])
                {
                    Q.push(make_pozdy(i,aux.y));
                    f[i][aux.y]=cst;
                }
        }

        for(i=aux.x;i<=n;i++)
        {
            cst=maxim(f[aux.x][aux.y]+1,x[i][aux.y]);
            if(f[i][aux.y]==0 || cst<f[i][aux.y])
                {
                    Q.push(make_pozdy(i,aux.y));
                    f[i][aux.y]=cst;
                }
        }

        for(i=aux.y;i>=1;i--)
        {
            cst=maxim(f[aux.x][aux.y]+1,x[aux.x][i]);
            if(f[i][aux.y]==0 || cst<f[i][aux.y])
                {
                    Q.push(make_pozdy(aux.x,i));
                    f[aux.x][i]=cst;
                }
        }


        for(i=aux.y;i<=m;i++)
        {
            cst=maxim(f[aux.x][aux.y]+1,x[aux.x][i]);
            if(f[i][aux.y]==0 || cst<f[i][aux.y])
                {
                    Q.push(make_pozdy(aux.x,i));
                    f[aux.x][i]=cst;
                }
        }
    Q.pop();
    } */
    //fac o dinamica smechera
    //f[i][j] = timpu minim ca lebada sa ajunga pe pozitia i,j
    f[aux.x][aux.y]=1;
    for(i=1;i<=aux.y;i++)
        f[aux.x][i]=x[aux.x][i];
    for(i=aux.x-1;i>=1;i--)
        for(j=1;j<=m;j++)
        {
            f[i][j]=minim(f[i+1][j],f[i][j-1]);
            if(f[i][j]==0)
                f[i][j]=f[i+1][j];
            f[i][j]=max(f[i][j],x[i][j]);
        }
    for(i=aux.x+1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            f[i][j]=minim(f[i-1][j],f[i][j-1]);
            if(f[i][j]==0)
                f[i][j]=f[i+1][j];
            f[i][j]=max(f[i][j],x[i][j]);

        }
}


void BF()
{
   int i,j;
   pozdy aux,now;
   for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(x[i][j]==0)
                Q.push(make_pozdy(i,j));
    while(!Q.empty())
    {
        aux=Q.front();
        for(i=0;i<4;i++)
            {
                now.x=aux.x+dx[i];
                now.y=aux.y+dy[i];
                if(x[now.x][now.y]==-2)
                {
                    x[now.x][now.y]=x[aux.x][aux.y]+1;
                    Q.push(now);
                }
            }
        Q.pop();
    }
}

int main()
{
    int i,j;
    char ch;
    pozdy p1,p2;
    double t1=clock();
    p1.x=p1.y=0;

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

    scanf("%d%d\n",&n,&m);
 /*   for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            scanf("%c",&ch);
            if(ch=='.')
                x[i][j]=0;
            if(ch=='X')
                x[i][j]=-2;
            if(ch=='L')
                {
                if(!p1.x && !p1.y)
                    p1.x=i, p1.y=j;
                else
                    p2.x=i, p2.y=j;
                }
        }
    scanf("\n");
    }
*/
    //BAG TESTELE DE MANA
   n=700; m=700;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(i!=1 && j!=1 && i!=n && j!=m)
                x[i][j]=-2;
            else
                x[i][j]=0;
    BF();
   /* for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            printf("%d ",x[i][j]);
        printf("\n");
    } */
    solve(p1,f1);
    solve(p2,f2);
    int min=1<<30,ma;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            {
                ma=max(f1[i][j],f2[i][j]);
                if(ma<min)
                    min=ma;
            }
    double t2=clock();
    //printf("%d",min-1);
    printf("TIMPU DE EXECUTIE %lf" , (t2-t1)/14.2);

    return 0;
}