Cod sursa(job #173825)

Utilizator Mishu91Andrei Misarca Mishu91 Data 8 aprilie 2008 10:01:46
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 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];
char 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] = 0;
        break;
      
        case '*':
          a[i][j] = -1;
          b[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]) continue;
      
      b[xvec][yvec] = 1;
      a[xvec][yvec] = a[xc][yc] + 1;
      
      Q.push(make_pair(xvec,yvec));
    }
  }
}

void solve()
{
  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 + dx[k];
      
      if(xvec < 1 || xvec > N) continue;
      if(yvec < 1 || yvec > M) continue;
      if((sol[xvec][yvec] == -1) || a[xvec][yvec] < sol[xc][yc])
      {
      
        sol[xvec][yvec] = min(sol[xc][yc],a[xvec][yvec]);
        Q.push(make_pair(xvec,yvec));
      
        if(xvec == xf && yvec == yf)
        {
          printf("%d\n",sol[xvec][yvec]);
          return;
        }
      }
    }
  }
}

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