Cod sursa(job #173893)

Utilizator Mishu91Andrei Misarca Mishu91 Data 8 aprilie 2008 11:39:45
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <cstdio>
#include <queue>
#define Nmax 1001

using namespace std;

inline int min(int a, int b)
{
  return (a<b)? (a) : (b);
}

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

int N,M,a[Nmax][Nmax],xs,xf,ys,yf,sol[Nmax][Nmax];
int b[Nmax][Nmax];

queue <pair <int,int> > Q;

void citire()
{
   scanf("%d %d",&N,&M);
  
   char ch;
  
   for(int i=1; i<=N; i++)
     for(int j=1; j<=M; j++)
     {
      scanf("\n %c",&ch);
      switch (ch)
      {

        case '*':
          a[i][j] = -1;
        break;
      
        case 'D':
          Q.push(make_pair(i,j));
          b[i][j] = 1;
        break;
      
        case 'I':
          xs = i;
          ys = j;
        break;
      
        case 'O':
          xf = i;
          yf = j;
        break;
      
    }
  }
  
  
}

void fill()
{
  int xc,yc,xvec,yvec;
  for(; !Q.empty(); Q.pop())
  {
    xc = Q.front().first;
    yc = Q.front().second;
    
    for(int k = 0; k<4; k++)
    {
      xvec = xc + dx[k];
      yvec = yc + dy[k];
      
      if(xvec < 1 || xvec > N) continue;
      if(yvec < 1 || yvec > M) continue;
      if(b[xvec][yvec] || a[xvec][yvec]) continue;
      
      b[xvec][yvec] = b[xc][yc] + 1;
      
      Q.push(make_pair(xvec,yvec));
    }
  }
  
  for(int i=1; i<=N; i++)
    for(int j=1; j<=M; j++)
      if(a[i][j] != -1) 
        a[i][j] = b[i][j] - 1;
}

void solve()
{
  for(int i=1; i<=N; i++)
    for(int j=1; j<=M; j++)
      sol[i][j] = -1;
  
  int xc,yc,xvec,yvec;
  
  sol[xs][ys] = a[xs][ys];
  
  for(Q.push(make_pair(xs,ys)); !Q.empty(); Q.pop())
  {
    xc = Q.front().first;
    yc = Q.front().second;
    
    for(int k=0; k<4; k++)
    {
      xvec = xc + dx[k];
      yvec = yc + dy[k];
      
      if(xvec < 1 || xvec > N) continue;
      if(yvec < 1 || yvec > M) continue;
      if(a[xvec][yvec] == -1) continue;
      
      if(sol[xvec][yvec] == -1)
      {  
        sol[xvec][yvec] = min(a[xvec][yvec], sol[xc][yc]);
        Q.push(make_pair(xvec,yvec));
        continue;
      }
      
      if(sol[xc][yc] > sol[xvec][yvec] && sol[xc][yc] <= a[xvec][yvec])
      {
        sol[xvec][yvec] = sol[xc][yc];
        Q.push(make_pair(xvec,yvec));
      }
    }
  }
  
  /*for(int i=1; i<=N; i++)
  {
    for(int j=1; j<=M; j++)
      printf("%d ",sol[i][j]);
    printf("\n");
  }*/
  
  printf("%d\n",sol[xf][yf]);
}

int main()
{
  freopen("barbar.in","r",stdin);
  freopen("barbar.out","w",stdout);
  citire();
  fill();
  solve();
  return 0;
}