Cod sursa(job #195419)

Utilizator marinMari n marin Data 18 iunie 2008 15:05:10
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
#define DIM 11
#define INF 13

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') {
	b[i][j]=0;
	k=1;
	while ((i-k>=1)&&((a[i-k][j]=='.') || (a[i-k][j]=='I') || (a[i-k][j]=='O'))) {
	  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]=='.') || (a[i+k][j]=='I') || (a[i+k][j]=='O'))) {
	  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]=='.') || (a[i][j+k]=='I') || (a[i][j+k]=='O'))) {
	  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]=='.') || (a[i][j-k]=='I') || (a[i][j-k]=='O'))) {
	  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;
    }

    for (i=p-2;i<=p+2;i++)
      if ((i>=1)&&(!incerc(i))) break;

    fprintf(g,"%d",i-1);
  }
  fclose(g);

//  printf("%d",incerc(1));


  return 0;
}