Cod sursa(job #195415)

Utilizator marinMari n marin Data 18 iunie 2008 14:43:42
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <stdio.h>
#define DIM 1001
#define INF 1003

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

int v[DIM][DIM];
int a[DIM][DIM];
int b[DIM][DIM];


int r,c,ok,x1,y1,x2,y2,k,p,u,m;



void caut(int i, int j, int x) {
  v[i][j]=1;
  int k,iv,jv;
  if (ok) return;
  if ((i==x2)&&(j==y2)) {
    ok=1;
    return;
  }
  for (k=0;k<=3;k++) {
    iv = i+dx[k];
    jv = j+dy[k];
    if ((iv<1)||(iv>r)||(jv<1)||(jv>c))
      continue;
    if ((v[iv][jv]==0)&&(b[iv][jv]>=x)) {
//      v[iv][jv]=1;
      caut(iv,jv,x);
    }
  }
}

int incerc(int x){
  int i,j;
  ok=0;
  for (i=1;i<=r;i++)
    for (j=1;j<=c;j++)
      v[i][j]=0;
  caut(x1,y1,x);
  return ok;


}




int main(){
  FILE *f = fopen("barbar.in","r");
  fscanf(f,"%d %d",&r,&c);
  int i,j;
  for (i=1;i<=r;i++) {
    fscanf(f,"\n");
    for (j=1;j<=c;j++) {
      fscanf(f,"%c",&a[i][j]);

      if (a[i][j]!='*')
	b[i][j]=INF;
      else
	b[i][j]=-1;
      if (a[i][j]=='I') {
	x1=i;y1=j;
      } else if (a[i][j]=='O'){
	x2=i;y2=j;
      }
    }

  }
  fclose(f);



  for (i=1;i<=r;i++)
    for (j=1;j<=c;j++)
      if (a[i][j]=='D') {
	a[i][j]=0;
	k=1;
	while ((i-k>=1)&&(a[i-k][j]=='.')) {
	  b[i-k][j]=b[i-k][j]<k?b[i-k][j]:k;
	  k++;
	}

	k=1;
	while ((i+k<=r)&&(a[i+k][j]=='.')) {
	  b[i+k][j]=b[i+k][j]<k?b[i+k][j]:k;
	  k++;
	}

	k=1;
	while ((j+k<=c)&&(a[i][j+k]=='.')) {
	  b[i][j+k]=b[i][j+k]<k?b[i][j+k]:k;
	  k++;
	}

	k=1;
	while ((j-k>=1)&&(a[i][j-k]=='.')) {
	  b[i][j-k]=b[i][j-k]<k?b[i][j-k]:k;
	  k++;
	}

      }

  FILE *g = fopen("barbar.out","w");
  if (!incerc(0)){
    fprintf(g,"-1");
  } else {
    p=0; u=INF;
    while (p<=u) {
      m = (p+u)/2;
      if (incerc(m))
	p=m+1;
      else
	u=m-1;
    }
    fprintf(g,"%d",u);
  }
  fclose(g);

  printf("%d",incerc(3));


  return 0;
}