Cod sursa(job #569021)

Utilizator rusu_raduRusu Radu rusu_radu Data 31 martie 2011 21:43:44
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <cstdio>
#include <cassert>
#include <queue>
#include <algorithm>
#define Nmax 1005
#define InFile "barbar.in"
#define OutFile "barbar.out"

using namespace std;

int n, m;
int C[Nmax][Nmax], M[Nmax][Nmax];
struct Punct {int x, y;} st, fsh;
queue <Punct> Q;

void read();
void boarding();
void Dragoons();
int solve();
void reinit();
int Lee (int);

int main()
{
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  boarding();
  Dragoons();
  printf ("%d\n", solve());
  return 0;
}

void read()
{
  int i, j;
  char c;
  Punct el;
  scanf ("%d %d\n", &n, &m);
  for (i=1; i<=n; i++)
  {
    for (j=1; j<=m; j++)
    {
      scanf ("%c", &c);
      if (c=='*') M[i][j]=-1, C[i][j]=-1;
      if (c=='D') el.x=i, el.y=j, Q.push (el), M[i][j]=1;
      if (c=='I') st.x=i, st.y=j;
      if (c=='O') fsh.x=i, fsh.y=j;
    }
    scanf ("%*c");
  }
}

void boarding ()
{
  int i;
  for (i=0; i<=m+1; i++)
    M[0][i]=M[n+1][i]=-1, C[0][i]=C[n+1][i]=-1;
  for (i=0; i<=n+1; i++)
    M[i][0]=M[i][m+1]=-1, C[i][0]=C[i][m+1]=-1;
}

void Dragoons()
{
  int i, j;
  Punct x, y;
  int dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
  while (!Q.empty())
  {
    x=Q.front(); Q.pop();
    for (i=0; i<4; i++)
    {
      y.x=x.x+dl[i]; y.y=x.y+dc[i];
      if (!M[y.x][y.y])
      {
        M[y.x][y.y]=M[x.x][x.y]+1;
        Q.push (y);
      }
    }
  }
  for (i=1; i<=n; i++)
    for (j=1; j<=m; j++)
      if (M[i][j]>0)
        M[i][j]--;
}

int solve()
{
  int mij, sg=0, dr=min (M[st.x][st.y], M[fsh.x][fsh.y]), p=-1;
  while (sg<=dr)
  {
    mij=sg+(dr-sg)/2;
    if (Lee (mij))
    {
      p=mij;
      sg=mij+1;
    }
    else
      dr=mij-1;
  }
  return p;
}

int Lee(int val)
{
  int i;
  Punct x, y;
  int dl[]={-1, 0, 1, 0}, dc[]={0, 1, 0, -1};
  reinit();
  Q.push (st);
  while (!Q.empty())
  {
    x=Q.front (); Q.pop();
    if (x.x==fsh.x && x.y==fsh.y) return 1;
    for (i=0; i<4; i++)
    {
      y.x=x.x+dl[i]; y.y=x.y+dc[i];
      if (!C[y.x][y.y] && M[y.x][y.y]>=val)
      {
        C[y.x][y.y]=1;
        Q.push (y);
      }
    }
  }
  return 0;
}

void reinit()
{
  int i, j;
  while (!Q.empty()) Q.pop();
  for (i=1; i<=n; i++)
    for (j=1; j<=m; j++)
      if (C[i][j]>0)
        C[i][j]=0;
}