Mai intai trebuie sa te autentifici.
Cod sursa(job #598314)
Utilizator | Data | 25 iunie 2011 13:41:53 | |
---|---|---|---|
Problema | A+B | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Lista lui wefgef | Marime | 4.33 kb |
// VA ROG IGNORATI SURSA. TESTEZ TIMPU DE EXECUTIE
#include<time.h>
#include<stdio.h>
#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]=min(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]=min(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("lbd.in","r",stdin);
freopen("lbd.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 %d" , (t2-t1)/14.2);
return 0;
}