Cod sursa(job #475236)

Utilizator mlazariLazari Mihai mlazari Data 6 august 2010 13:32:07
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<fstream>
#include<queue>

using namespace std;

#define NMAX 1003
#define INF 1000000000

ifstream fi("barbar.in");
ofstream fo("barbar.out");

int dl[4]={0,-1,0,1},dc[4]={-1,0,1,0};
int l,c,li,ci,lo,co,i,j;
char h[NMAX][NMAX];
int dr[NMAX][NMAX],barb[NMAX][NMAX];
queue< pair<int,int> > q;

void bfsDr(int lin,int col) {
  if(!dr[lin][col]) return;
  pair<int,int> per;
  int lc,cc,lu,cu,i;
  dr[lin][col]=0;
  q.push(make_pair(lin,col));
  while(!q.empty()) {
    per=q.front();
    lc=per.first;
    cc=per.second;
    q.pop();
    for(i=0;i<4;++i) {
      lu=lc+dl[i];
      cu=cc+dc[i];
      if(lu>=0 && lu<l && cu>=0 && cu<c)
       if(h[lu][cu]!='*' && dr[lu][cu]>dr[lc][cc]+1) {
         if(h[lu][cu]=='D') dr[lu][cu]=0;
         else dr[lu][cu]=dr[lc][cc]+1;
         q.push(make_pair(lu,cu));
       }
    }
  }
}

void bfsBarb() {
  pair<int,int> per;
  int lc,cc,lu,cu,i,vmin;
  barb[li][ci]=dr[li][ci];
  q.push(make_pair(li,ci));
  while(!q.empty()) {
    per=q.front();
    lc=per.first;
    cc=per.second;
    q.pop();
    for(i=0;i<4;++i) {
      lu=lc+dl[i];
      cu=cc+dc[i];
      if(lu>=0 && lu<l && cu>=0 && cu<c)
       if(h[lu][cu]!='*') {
         vmin=min(barb[lc][cc],dr[lu][cu]);
         if(vmin>barb[lu][cu]) {
           barb[lu][cu]=vmin;
           q.push(make_pair(lu,cu));
         }
       }
    }
  }
}

int main() {
  fi>>l>>c;
  for(i=0;i<l;++i) fi>>h[i];
  for(i=0;i<l;++i)
   for(j=0;j<c;++j) {
     dr[i][j]=INF;
     barb[i][j]=-INF;
   }
  for(i=0;i<l;++i)
   for(j=0;j<c;++j)
    switch(h[i][j]) {
      case 'I': li=i,ci=j; break;
      case 'O': lo=i; co=j; break;
      case 'D': bfsDr(i,j);
    }
  bfsBarb();
  if(barb[lo][co]>-INF) fo<<barb[lo][co];
  else fo<<-1;
  return 0;
}