Pagini recente » Cod sursa (job #100579) | Cod sursa (job #2977096) | Cod sursa (job #399123) | Cod sursa (job #2062295) | Cod sursa (job #110674)
Cod sursa(job #110674)
using namespace std;
#include <cstdio>
#include <queue>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#define maxn 1501
#define oo 15000
#define rnd rand()
char a[maxn][maxn];
short days[maxn][maxn];
int n, m;
const int xx[]={-1, 0, 1, 0};
const int yy[]={0, 1, 0, -1};
short d[maxn][maxn];
void read()
{
freopen("lbd.in","r",stdin);
scanf("%d %d\n", &n, &m);
char ax[1500];
int i, j;
for(i=1;i<=n;++i)
{
gets(ax);
for(j=0;j<m;++j) a[i][j+1]=ax[j];
}
}
struct nod { short x, y;nod(){}; nod(short a,short b){x=a; y=b;};};
inline int oki(int i, int j)
{
if(i>=1 && i<=n && j>=1 && j<=m) return 1;
return 0;
}
struct cmp{
bool operator()(const nod &a, const nod &b)const
{
if(d[a.x][a.y]>d[b.x][b.y])return 1;
return 0;
}
};
void init_days()
{
queue<nod>Q;
int i, j, newx, newy;
for(i=0;i<=n;++i)
for(j=0;j<=m;++j) days[i][j]=oo;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(a[i][j]=='.' || a[i][j]=='L') Q.push(nod(i, j)), days[i][j]=0;
nod u;
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(i=0;i<4;++i)
{
newx=u.x+xx[i];
newy=u.y+yy[i];
if(oki(newx, newy) && days[newx][newy]==oo)
{
days[newx][newy]=days[u.x][u.y]+1;
Q.push(nod(newx, newy));
}
}
}
}
void solve()
{
int i, j;
priority_queue<nod, vector<nod> , cmp>Q;
int newx, newy;
for(i=0;i<=n;++i)
for(j=0;j<=m;++j) d[i][j]=oo;
nod s,e;
int ok=1;
for(i=1;i<=n && ok;++i)
for(j=1;j<=m && ok;++j)
if(a[i][j]=='L')
{
s.x=i;s.y=j; ok=0;
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
if(i==s.x && j==s.y) continue;
if(a[i][j]=='L'){e.x=i, e.y=j;break;}
}
d[s.x][s.y]=0;
Q.push(s);
nod u;
while(!Q.empty())
{
u=Q.top();
Q.pop();
for(i=0;i<4;++i)
{
newx=u.x+xx[i];
newy=u.y+yy[i];
if(oki(newx, newy))
if(max(days[newx][newy],d[u.x][u.y])<d[newx][newy])
{
d[newx][newy]=max(days[newx][newy], d[u.x][u.y]);
Q.push(nod(newx, newy));
}
}
}
freopen("lbd.out","w",stdout);
printf("%d\n", d[e.x][e.y]);
}
int main()
{
// read();
srand(time(0));
int i, j, sx, sy, ex, ey;
n=1500; m=1500;
sx=rnd%n+1;
sy=rnd%m+1;
ex=rnd%n+1;
ey=rnd%m+1;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
if(i==sx && j==sy)a[i][j]='L';
else if(i==ex && j==ey) a[i][j]='L';
else
{
if(rand()&1) a[i][j]='.';
else a[i][j]='X';
}
}
init_days();
solve();
return 0;
}