Cod sursa(job #110675)

Utilizator gigi_becaliGigi Becali gigi_becali Data 27 noiembrie 2007 12:24:12
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
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 && rand()&1) a[i][j]='.';
	    else a[i][j]='X';
	  }
      }
	
  init_days();
  solve();

  return 0;
}