Cod sursa(job #366317)

Utilizator mlazariLazari Mihai mlazari Data 21 noiembrie 2009 15:19:40
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>

#define NMAX 1003
#define INFINIT 1000000

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

int r,c,i,j,li,ci,lo,co;
char harta[NMAX][NMAX];
int dragon[NMAX][NMAX],barbar[NMAX][NMAX];

void BFSdragon(int lin,int col,int x) {
  if(lin<0 || col<0 || lin>=r || col>=c || harta[lin][col]=='*' || dragon[lin][col]<=x)
   return;
  if(harta[lin][col]=='D') x=0;
  dragon[lin][col]=x;
  for(int i=0;i<4;i++) BFSdragon(lin+dx[i],col+dy[i],x+1);
}

void BFSbarbar(int lin,int col,int x) {
  if(lin<0 || col<0 || lin>=r || col>=r || harta[lin][col]=='*' ||
     barbar[lin][col]>=x || barbar[lin][col]==dragon[lin][col]) return;
  barbar[lin][col]=x<dragon[lin][col]?x:dragon[lin][col];
  for(int i=0;i<4;i++) BFSbarbar(lin+dx[i],col+dy[i],barbar[lin][col]);
}

int main() {
  freopen("barbar.in","r",stdin);
  freopen("barbar.out","w",stdout);
  scanf("%d%d\n",&r,&c);
  for(i=0;i<r;i++) fgets(harta[i],NMAX,stdin);

  for(i=0;i<r;i++)
   for(j=0;j<c;j++) {
     dragon[i][j]=INFINIT;
     barbar[i][j]=-1;
   }

  for(i=0;i<r;i++)
   for(j=0;j<c;j++)
    switch(harta[i][j]) {
      case 'D': BFSdragon(i,j,0); break;
      case 'I': li=i; ci=j; break;
      case 'O': lo=i; co=j; break;
    }

  BFSbarbar(li,ci,dragon[li][ci]);

  printf("%d\n",barbar[lo][co]);
  return 0;
}